正则表达式:仅在找到字符串A且不在字符串B时匹配

时间:2010-08-12 21:00:44

标签: regex grep

我正在尝试编写一个正则表达式,如果找到字符串A并且找不到字符串B,它将基本上返回true。

更具体地说,我正在寻找我服务器上的文件“base64_decode”,但不是“版权”。

谢谢!

5 个答案:

答案 0 :(得分:3)

我不确定你的真正任务是否可以在传递给grep的正则表达式中解决,因为grep逐行处理文件。我会使用-l--files-with-matches)和-L--files-without-match)选项以及命令替换反引号,如下所示:

grep -L copyright `grep -l base64_decode *`

grep -l base64_decode *列出其中包含“base64_decode”的所有文件的名称,并在grep -L copyright之后将该列表放在命令行上,后者搜索这些文件并列出它们的子集不包含“版权”。

答案 1 :(得分:0)

使用负向前瞻和后视:

^(?<!.*copyright.*)(base64_decode)(?!.*copyright.*)$

Perl尚不支持:-P。

答案 2 :(得分:0)

不建议在一个正则表达式中执行此操作,但如果必须,可以使用前瞻:

^(?=.*must-have)(?!.*must-not-have)

您可能希望以单行/全点模式执行此操作,而起始锚点可能是\A而不是^

(?=…) 正面前瞻;它断言给定的模式可以匹配。 (?!…) 否定前瞻;它断言给定模式可以 NOT 匹配。

参考

答案 3 :(得分:0)

Piped greps应该能够轻松实现这一目标:

find -type f -print | xargs grep -l“base64_decode”| xargs grep -L“copyright”

答案 4 :(得分:-3)

我认为是

^.*[^copyright].*base64_decode.*[^copyright].*$

然而,这将在任何地方捕捉到版权,即使它本身不是单词。

我错了,但在下面我的例子仍然适用于此处的大多数其他例子

例如它会匹配

This text is non-copyrightable because I said so! but it is not encoded in base64_decode unfortunatly :(