ansible back refernce /1 не заменяет захваченную группу

#regex #ansible

#регулярное выражение #ansible

Вопрос:

У меня есть эта простая строка, в которой я хотел бы заменить контейнер на XXXX:

 <Resource name="jdbc/X1" auth="Container" type="javax.sql.DataSource"              
              username="yyyy" password="yyyyy"
              driverClassName="oracle.jdbc.OracleDriver"
              url="jdbc:oracle:thin:yyyyy/yyyyy@yyyy:yyyy/yyyy"
              validationQuery="SELECT 1 from dual"/>
  

это ansible-playbook

 ---
- name: "xml handler"
  hosts: localhost
  connection: local
  tasks:
  - name: Test2
    debug:
       msg: "hey"
  - name: Replace between the expressions (requires Ansible >= 2.4)
    replace:
     path: /home/ec2-user/backip/foo.xml
     after: 'Resource name="jdbc/X1"'
     before: '/>'
     regexp: 'auth="(.*?)"'
     replace: 'XXXX1'
  - name: Test2
    debug:
       msg: "bye"
  

но все, что я получаю, это :

 <Resource name="jdbc/X1" XXXX Container type="javax.sql.DataSource"              
              username="yyyy" password="yyyyy"
              driverClassName="oracle.jdbc.OracleDriver"
              url="jdbc:oracle:thin:yyyyy/yyyyy@yyyy:yyyy/yyyy"
              validationQuery="SELECT 1 from dual"/>
  

что здесь не так в этом простом регулярном выражении?

Ожидаемый результат :

 <Resource name="jdbc/X1" auth="XXXX" type="javax.sql.DataSource"
  

Комментарии:

1. каков ожидаемый результат? из входных данных и регулярного выражения вывод, который вы опубликовали, — это именно то, что я ожидал получить.

2. Разве это не должно быть 'XXXX\1' ?

3. почему «\ 1″ во всех примерах это » 1″

4. @toydarian я обновляю вопрос

Ответ №1:

Вы можете попробовать разделить шаблон замены на две части:

      regexp: '(auth=")(?:.*?)(")'
     replace: '1XXXX2'
  

При этом вывод корректен:

 <Resource name="jdbc/X1" auth="XXXX" type="javax.sql.DataSource"
  

В вашем фактическом регулярном выражении auth="(.*?)" :

  • 1 соответствует «Контейнеру»
  • таким XXXX1 образом, получается «XXXXContainer»

Ваше регулярное выражение: https://regex101.com/r/Ln7Aca/1

Измененный (с правильным выводом): https://regex101.com/r/Qb2grI/1