我正在尝试编写一个正则表达式,如果找到字符串A并且找不到字符串B,它将基本上返回true。
更具体地说,我正在寻找我服务器上的文件“base64_decode”,但不是“版权”。
谢谢!
答案 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 :(