Como fazer o regex-replace em um arquivo usando Ansible?

5

Com base neste exemplo:

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

de esta documentação , tentou-se fazer uma regex-replace no Ansible.

Versão com efeito

user@server:/home$ ansible --version
ansible 2.1.1.0

/ path / to / file:

helloworld

Snippets de Ansible:

- lineinfile:
  dest: /path/to/file
  regexp='^(hello)world$'
  line='30'

tentativa 2

- lineinfile:
  dest: /path/to/file
  regexp='^(hello)world$'
  line="30"

Resultado esperado:

hello030

Resultado atual:

30

Perguntas

  1. Por que o resultado é 30 em vez de hello030 ?
  2. Como resolver isso?
por 030 15.09.2016 / 12:43

2 respostas

8

Why is the outcome 30 instead of hello030?

O padrão do módulo lineinfile é backrefs: false . Seu regexp='^(hello)world$' corresponde ao conteúdo inteiro de arquivo . Literal de line='30' substitui o conteúdo.

How to solve it?

  1. Ative os backrefs com backrefs: true
  2. Use um grupo nomeado em line:

Um backref seguido por números não funcionará como esperado. Você precisará de um grupo nomeado. por exemplo. \g<1>

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

Suponho que seja porque ele corresponde ao inteiro \ 1030 (como 1030-th backref). Talvez tente \ 1 030 primeiro e você verá, se for o motivo.

    
por 15.09.2016 / 16:52

Tags