如何使用 Ansible 在文件中进行正则表达式替换?

如何使用 Ansible 在文件中进行正则表达式替换?

基于此示例:

- 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

问题

  1. 为什么结果不是\1030hello030
  2. 如何解决?

答案1

为什么结果是\1030而不是hello030?

lineinfile 模块默认为backrefs: false。您的regexp='^(hello)world$'匹配内容为文件. 文字来自line='\1030'替换内容。

如何解决?

  1. 使用以下方式启用反向引用backrefs: true
  2. 使用命名组line:

带数字的反向引用不会按预期发挥作用。您需要一个命名组。例如\g<1>

- name: Replace the world
  lineinfile:
    dest: file
    regexp: '^(hello)world$'
    line: '\g<1>030'
    backrefs: true

答案2

我猜是因为它匹配整个 \1030(作为第 1030 个反向引用)。也许先试试 \1 030,你就会知道这是否是原因。

相关内容