Ansible 反向引用 /1 不会替换捕获的组

问题描述 投票:0回答:1

我有一个简单的字符串,我想用 XXXX 替换 Container:

<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 剧本:

---
- 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: 'XXXX\1'
  - 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"
regex ansible
1个回答
1
投票

您可以尝试将替换模式分成两部分:

     regexp: '(auth=")(?:.*?)(")'
     replace: '\1XXXX\2'

这样输出是正确的:

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

在你实际的正则表达式中

auth="(.*?)"

  • \1
    匹配“容器”
  • 所以
    XXXX\1
    给出“XXXXContainer”

您的正则表达式:https://regex101.com/r/Ln7Aca/1

修改后的一个(输出正确):https://regex101.com/r/Qb2grI/1

© www.soinside.com 2019 - 2024. All rights reserved.