【问题标题】:Ansible replace to replace a certain regex groupAnsible replace 替换某个正则表达式组
【发布时间】:2016-05-19 11:41:54
【问题描述】:

我正在使用Ansible replace module 替换一个字符串,该字符串是我的正则表达式的第一组。

- name: Replace my_address
      replace:
        dest=/etc/mydata/info.yaml
        regexp="^my_address\W\s(localhost)$"
        replace="{{ ansible_eth0.ipv4.address }}"

在我的文件中,我多次提及localhost,我只想在以下行替换localhostmy_address: localhost

到目前为止,上面的代码将整行替换为 IP 地址。有没有办法只替换第一组正则表达式?

【问题讨论】:

    标签: regex ansible ansible-playbook


    【解决方案1】:

    你需要使用lookbehind:

    regexp="(?<=^my_address\W\s)localhost$"
    

    regex demo

    只有消耗的部分 (localhost) 将被替换,(?&lt;=^my_address\W\s) 将检查是否有 my_address 前面有一个非单词字符 + 空格。

    【讨论】:

    • 有没有办法修改表达式以适用于my_address 和另一行如IP_address: localhost?我仍然不太擅长正则表达式。
    • 因为这是 Python,你需要像 (?&lt;=^my_address\W\s|^IP_address\W\s)localhost$ 这样的东西。幸运的是,这两个字符串的长度相同。
    • 谢谢,但现在我很好奇是否有办法用不同长度的字符串来做到这一点。
    • 您将不得不使用一个交替组,将后视作为单独的分支:'(?:(?&lt;=^my_address\W\s)|(?&lt;=^IP_my_address\W\s))localhost$'(不要在一个后视中尝试交替:它将在 regex101.com 上工作,这是一个错误地点)。这是IDEONE test
    【解决方案2】:

    要引用特定的捕获组,您可以使用\g&lt;1&gt;\g&lt;groupName&gt; 替换。请参考https://docs.ansible.com/ansible/latest/collections/ansible/builtin/replace_module.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-12
      • 2018-01-16
      • 1970-01-01
      • 1970-01-01
      • 2016-11-12
      • 1970-01-01
      • 1970-01-01
      • 2015-07-25
      相关资源
      最近更新 更多