如何反转grep表达式

sMa*_*MaN 225 regex linux grep

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

ls -R |grep -E .*[\.exe]$\|.*[\.html]$  
Run Code Online (Sandbox Code Playgroud)

如何反转此结果以列出那些不是.html或.exe的结果.(也就是说!=.)

Eri*_*tis 326

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

ls -R |grep -v -E .*[\.exe]$\|.*[\.html]$
Run Code Online (Sandbox Code Playgroud)

  • 应该注意的是-v -invert-match不一定会翻转grep的返回代码是否表示成功执行,而是匹配否则不匹配的行。那些希望反转返回码的人(即,如果所有行均不匹配该模式,而不是至少一个不匹配模式,则返回成功)应使用`!grep`。可用于条件表达式,例如:`if!ls | grep -qE“。(\。exe)$”; 然后在$(pwd)中回显No .exe文件; fi`。 (4认同)

dar*_*ioo 97

grep -v
Run Code Online (Sandbox Code Playgroud)

要么

grep --invert-match
Run Code Online (Sandbox Code Playgroud)

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

find . -type f \( -iname "*" ! -iname ".exe" ! -iname ".html"\)
Run Code Online (Sandbox Code Playgroud)

更多信息在这里.

  • @Eric无论OP的要求如何,反转grep表达式不仅仅是查找文件.我怀疑这是大多数人来到这里的原因. (4认同)
  • `find`命令是这个XY问题的最语义解决方案.为此目的组合`ls`和`grep`似乎充其量只是hacky.这应该是公认的答案.(1) (2认同)

Rob*_*ers 29

在命令中添加-v选项以grep反转结果.


jmd*_*_dk 13

正如多次所述,反转是通过-v选项实现的grep。让我添加(希望是有趣的)注释,您可以通过搜索grep帮助文本来自己解决这个问题:

grep --help | grep invert
Run Code Online (Sandbox Code Playgroud)

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


Anj*_*ova 8

 grep "subscription" | grep -v "spec"  
Run Code Online (Sandbox Code Playgroud)