【问题标题】:ansible back refernce /1 dosn't replace the group capturedansible backreference /1 不会替换捕获的组
【发布时间】:2020-10-20 11:50:57
【问题描述】:

我有一个简单的字符串,我喜欢用 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-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: '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"

【问题讨论】:

  • 预期的输出是什么?从输入和正则表达式来看,您发布的输出正是我期望得到的。
  • 不应该是'XXXX\\1'吗?
  • 为什么“\\1”在所有示例中都是“\1”
  • @toydarian 我更新问题

标签: regex ansible


【解决方案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

【讨论】:

    猜你喜欢
    • 2011-02-24
    • 2021-02-13
    • 2011-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-04
    • 2017-04-08
    相关资源
    最近更新 更多