尝试匹配整个单词时,正则表达式失败

尝试匹配整个单词时,正则表达式失败

这是我的测试文件test.txt

hello

user1 ALL=(ALL) NOPASSWD: /usr/bin/* /app/tomcat/tomcat*/webapps/*, /usr/bin/rm -rf /app/tomcat/tomcat*/webapps/*,/bin/rm -rf /app/tomcat/tomcat*/webapps/**.sh , /bin/kill -3 *

我能够使用下面的正则表达式成功找到所需的行

grep -P '(^[^#;]ser1.*ALL=\(ALL\) NOPASSWD.*\/app\/tomcat.*$)' test.txt

但是,当我给出完整的单词user1而不是ser1正则表达式时,不匹配

正则表达式失败的原因如下;它不匹配:

grep -P '(^[^#;]user1.*ALL=\(ALL\) NOPASSWD.*\/app\/tomcat.*$)' test.txt

我想user1在正则表达式中提供以匹配该行。

你能建议一下吗?

答案1

问题是你试图明确地实现两件事,但它们却相互暗示:

  • 该行应该以user1
  • 该行不应以注释符号(#;)开头

#但是,您的第二个正则表达式指出“该行应以不是or的任何字符开头;,然后包含user1。因此,grep预计 之前有一个字符user1。这在第一个正则表达式中没有问题,您要求“任何字符不是#;后跟ser1",就像以不是或 的user1字符开头一样。#;

如果您确定该行以 开头user1,您可以简单地使用

grep -P '^user1 etc.'

或者,如果可能有空格,

grep -P '^ *user1 etc.'

答案2

您将正则表达式锚定到行的开头:

^[^#;]ser1

#这意味着“匹配以or以外的任何字符开头的行;,然后是字符串ser1。因此, the与of[^#;]匹配。如果要给出整个单词,则需要查找直接以以下字符开头的行:uuser1user1

^user1

或者,允许该模式出现 0 次[^#;]

^[^#;]*ser1

所以,你的完整命令可能是这样的:

grep -P '(^user1.*ALL=\(ALL\) NOPASSWD.*\/app\/tomcat.*$)' test.txt

或者

grep -P '(^[^#;]*user1.*ALL=\(ALL\) NOPASSWD.*\/app\/tomcat.*$)' test.txt

然而,这看起来非常非常复杂。您真正需要的是:

grep -P '^[^#;]*user1'

在这个例子中。

相关内容