#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