如何反转grep表达式


237

以下grep表达式成功列出了当前目录和子目录中的所有.exe和.html文件。

ls -R |grep -E .*[\.exe]$\|.*[\.html]$  

我该如何反转此结果以列出那些不是.html或.exe的结果。(即!=。)

Answers:


337

使用命令行选项-v--invert-match

ls -R |grep -v -E .*[\.exe]$\|.*[\.html]$

4
应该注意的是,-v/ --invert-match不一定会翻转的返回代码是否grep指示成功执行,而是将匹配否则不匹配的行。那些希望反转返回代码的人(即,如果所有行均不匹配该模式,而不是至少一个不匹配该模式,则应成功)! grep。这可用于条件表达式,例如:if ! ls | grep -qE ".(\.exe)$"; then echo No .exe files in $(pwd); fi
Zyl

98
grep -v

要么

grep --invert-match

您还可以使用find以下方法执行相同的操作:

find . -type f \( -iname "*" ! -iname ".exe" ! -iname ".html"\)

更多信息在这里


2
find命令是此XY问题的最语义解决方案。结合起来lsgrep为此目的似乎很难。这应该是公认的答案。(+1)
埃里克·海斯特兰德'16

4
@Eric不管OP的要求如何,反转grep表达式都比查找文件有用。我怀疑这就是大多数人来这里的原因。
byxor



7

如多次说明,通过-v选择可以实现反转grep。让我添加(希望很有趣)的注释,即您可以通过遍历grep帮助文本来自己解决此问题:

grep --help | grep invert

-v,--invert-match选择不匹配的行

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.