【问题标题】:Python regexp problem in Ansible playbookAnsible 剧本中的 Python 正则表达式问题
【发布时间】:2020-05-14 09:21:45
【问题描述】:

我在 Zabbix 代理配置中有一个字符串,例如

HostMetadata=Linux

我想用变量“nginx”把它改成:

HostMetadata=Linux nginx

此更改必须是幂等的。但是当我使用代码两次时,行改为

HostMetadata=Linux nginx nginx

我的代码:

      - name: regexp
        lineinfile:
          path: /etc/zabbix/zabbix_agentd.conf
          regexp: '^(HostMetadata=Linux.*)$'
          line:  '\1 nginx'
          backrefs: yes
        tags: regexp

我尝试了“^HostMetadata=((?!nginx).)*$”,但它破坏了下一步,结果将是“x nginx”

我想创建可重用的代码并添加新参数。例如:

VAR=nginx
"HostMetadata=Linux" -> "HostMetadata=Linux nginx"

VAR=apache
"HostMetadata=Linux nginx" ->  "HostMetadata=Linux nginx apache"

VAR=nginx
"HostMetadata=Linux nginx apache" -> "HostMetadata=Linux nginx apache" (nothing changed)

【问题讨论】:

    标签: python regex ansible


    【解决方案1】:

    你应该只捕获你需要保留的部分,其余的应该是匹配的。

    你可以使用

    regexp: '^(HostMetadata=Linux).*'
    

    请参阅regex demo

    详情

    • ^ - 字符串开头
    • (HostMetadata=Linux) - 捕获组 #1(用替换字符串中的 \1 引用):文字字符串
    • .* - 字符串的其余部分到末尾,除换行符之外的任何 0 个或多个字符,尽可能多。

    【讨论】:

    • 感谢您的回答。抱歉,这是我的第一个问题 =) 我为问题添加了更多描述。
    • @AlxiRus 所以,试试^(HostMetadata=Linux(?!.*nginx).*)
    • @AlxiRus 这样更好吗?
    • 非常感谢!正是我想要的!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-20
    • 2014-11-29
    • 1970-01-01
    相关资源
    最近更新 更多