【问题标题】:Ansible regexp match parenthesisAnsible 正则表达式匹配括号
【发布时间】:2018-01-19 22:34:45
【问题描述】:

我需要匹配一个字符串NAME ALL=(ALL) NOPASSWD: ALL 但是我被括号卡住了。

我使用了一个网站来帮助我构建表达式,但无法弄清楚。 到目前为止,我得到了: \sNAME\sALL=\(ALL\)\s\s\s\s\s\s\sNOPASSWD:\sALL 但是,这没有括号符号... 我还使用了大量的\s,我确定有更好的方法吗?

我正在使用 Ansible Lineinfile 模块来删除该行。 感谢所有帮助,谢谢!

编辑:以防万一,我的小剧本补充说,可能是我在那里做错了什么:

嗨。

是的,它在所有这些生成器中都匹配,但无论出于何种原因,我都无法让它在我的剧本中运行,我是个白痴还是这样?

- hosts: all
  become: true
  tasks:
  - name: Remove user
    lineinfile:
      dest: /etc/sudoers
      regexp: '^.*NAME.*$'
      state: 'absent'

【问题讨论】:

  • 您是否需要完全匹配该字符串而不需要其他任何内容?空间数量等没有灵活性?
  • 使用\s+ 而不是多个\ss。如果你想更具体,你可以做\s{7} = 7 times \s
  • 因为如果是这种情况,您发布的正则表达式应该可以解决问题,请查看:regex101.com/r/38xmc2/1
  • @GalAbra,如果空格或换行符太多,OP可能不想匹配。在这种情况下,\s+ 不会有任何好处。
  • @AdrienBrunelat 因为这是一个非常具体的正则表达式,所以我认为它已经足够好了。但无论如何,我已经在我的评论中添加了\s{7} 选项

标签: regex ansible


【解决方案1】:
  • 您需要使用\ 转义()
  • 字符串中的空格与正则表达式中的空格匹配;
  • 您可以在^$(或其中一个)之间编写表达式,以确保它只匹配确切的行(例如,不是注释掉的行)。

要匹配问题中的确切行:

regexp: '^NAME ALL=\(ALL\)       NOPASSWD: ALL$'

您还可以使用带有乘数的\s 来匹配随机长度的空格,例如在NOPASSWD 字符串之前:

regexp: '^NAME ALL=\(ALL\)\s*NOPASSWD: ALL$'

但是

您正在尝试修改/etc/sudoers ― 花一些时间阅读Is it safe to edit /etc/sudoers with the Ansible "lineinfile" module?,尤其是this answer

【讨论】:

  • 嗨@techraf,是的,我正在验证它。我读过一些对 /etc/sudoers 修改不足的可怕故事。问题,为什么是\s* 而不是\s+?在NAMEALL 之间不需要\s 吗?
  • 我不知道为什么。你问了一个问题,我回答了。我给了你另一个选项来表明可能性。基本信息是:()需要用\ 转义,一个空格匹配一个空格,可以用\s加一个乘数。您如何使用这些信息取决于您。
猜你喜欢
  • 1970-01-01
  • 2011-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-18
  • 2016-02-13
  • 2013-06-18
相关资源
最近更新 更多