首页 > 解决方案 > Ansible - 替换文件中的行

问题描述

我对 Ansible 真的很陌生,但我遇到了替换模块的情况。

我在线尝试了我的正则表达式https://regex101.com/并且它有效。

然后我在我的 Ansible 中尝试了正则表达式,但它不起作用。我也尝试使用 lineInFile 模块。猜猜我仍然在想旧的方式,而不是正确的 Ansible 方式。因此,我无法将其放在一起。

- name: Update the CMakeLists, add -latomic
  replace:
    path: /home/{{ device_user }}/ros2_{{ ros2_distro }}/src/ros2/rcutils/CMakeLists.txt
    regexp: '^\s+target_link_libraries\(test_atomics_executable\s+\${PROJECT_NAME}'
    replace: '^\s+target_link_libraries\(test_atomics_executable\s+\${PROJECT_NAME} -latomic\)'

这些行产生:

The error was: re.error: bad escape \s at position 1

我不知道为什么会这样,因为正则表达式没问题,不是吗?我试图找到完全匹配我知道只有这样的一行。

我尝试进行更改的 CMakeLists.txt:

  ...
  target_link_libraries(test_atomics_executable ${PROJECT_NAME})
  if(HAVE_LIBATOMICS)
    target_link_libraries(test_atomics_executable atomic)
  endif()
  add_test(NAME test_atomics COMMAND test_atomics_executable)
  ...

你能告诉我我做错了什么吗? (请不要费心只链接我已经在那里的文档,我试图阅读它。)

标签: ansible

解决方案


错误

 re.error: bad escape \s at position 1

指向参数中的第一个位置replace

 replace: '^\s+target_link_libraries ... '

参数replace不是正则表达式。尝试

- replace:
    path: CMakeLists.txt
    regexp: '^\s+target_link_libraries\(test_atomics_executable\s+\${PROJECT_NAME}\)(.*)$'
    replace: '  target_link_libraries(test_atomics_executable ${PROJECT_NAME} -latomic)'

这应该替换文件中的第一行

-  target_link_libraries(test_atomics_executable ${PROJECT_NAME})
+  target_link_libraries(test_atomics_executable ${PROJECT_NAME} -latomic)

这是你想要的吗?我不确定前导间距。


推荐阅读