Назад | Перейти на главную страницу

Как заменить регулярное выражение в файле с помощью 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. Почему результат \1030 вместо того hello030?
  2. Как это решить?

Почему результат \ 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

Я предполагаю, что это потому, что он соответствует целому \ 1030 (как 1030-й backref). Может быть, сначала попробуйте \ 1 030, и вы увидите, причина в этом.