![如何使用 Ansible 在文件中进行正则表达式替换?](https://linux22.com/image/689993/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%20Ansible%20%E5%9C%A8%E6%96%87%E4%BB%B6%E4%B8%AD%E8%BF%9B%E8%A1%8C%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%E6%9B%BF%E6%8D%A2%EF%BC%9F.png)
基于此示例:
- lineinfile: dest=/opt/jboss-as/bin/standalone.conf regexp='^(.*)Xms(\d+)m(.*)$' line='\1Xms${xms}m\3' backrefs=yes
从本文档,尝试在 Ansible 中执行正则表达式替换。
Ansible 版本
user@server:/home$ ansible --version
ansible 2.1.1.0
/路径/到/文件:
helloworld
Ansible 片段:
- lineinfile:
dest: /path/to/file
regexp='^(hello)world$'
line='\1030'
尝试 2
- lineinfile:
dest: /path/to/file
regexp='^(hello)world$'
line="\1030"
预期结果:
hello030
目前结果:
\1030
问题
- 为什么结果不是
\1030
呢hello030
? - 如何解决?
答案1
为什么结果是\1030而不是hello030?
lineinfile 模块默认为backrefs: false
。您的regexp='^(hello)world$'
匹配内容为文件. 文字来自line='\1030'
替换内容。
如何解决?
- 使用以下方式启用反向引用
backrefs: true
- 使用命名组
line:
带数字的反向引用不会按预期发挥作用。您需要一个命名组。例如\g<1>
- name: Replace the world
lineinfile:
dest: file
regexp: '^(hello)world$'
line: '\g<1>030'
backrefs: true
答案2
我猜是因为它匹配整个 \1030(作为第 1030 个反向引用)。也许先试试 \1 030,你就会知道这是否是原因。