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

030*_*030 6 ansible

基于这个例子:

- lineinfile: dest=/opt/jboss-as/bin/standalone.conf regexp='^(.*)Xms(\d+)m(.*)$' line='\1Xms${xms}m\3' backrefs=yes
Run Code Online (Sandbox Code Playgroud)

该文档中,尝试在 Ansible 中进行正则表达式替换。

Ansible 版本

user@server:/home$ ansible --version
ansible 2.1.1.0
Run Code Online (Sandbox Code Playgroud)

/路径/到/文件:

helloworld
Run Code Online (Sandbox Code Playgroud)

Ansible 片段:

- lineinfile:
  dest: /path/to/file
  regexp='^(hello)world$'
  line='\1030'
Run Code Online (Sandbox Code Playgroud)

尝试 2

- lineinfile:
  dest: /path/to/file
  regexp='^(hello)world$'
  line="\1030"
Run Code Online (Sandbox Code Playgroud)

预期结果:

hello030
Run Code Online (Sandbox Code Playgroud)

当前结果:

\1030
Run Code Online (Sandbox Code Playgroud)

问题

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

jsc*_*ott 11

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

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

如何解决?

  1. 打开反向引用 backrefs: true
  2. 使用命名组 line:

后跟数字的 backref 不会按预期运行。您将需要一个命名组。例如\g<1>

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