【发布时间】:2010-12-07 05:27:38
【问题描述】:
以下 grep 表达式成功列出了当前目录和子目录中的所有 .exe 和 .html 文件。
ls -R |grep -E .*[\.exe]$\|.*[\.html]$
如何反转此结果以列出不是 .html 或 .exe 的结果。 (即!=。)
【问题讨论】:
以下 grep 表达式成功列出了当前目录和子目录中的所有 .exe 和 .html 文件。
ls -R |grep -E .*[\.exe]$\|.*[\.html]$
如何反转此结果以列出不是 .html 或 .exe 的结果。 (即!=。)
【问题讨论】:
使用命令行选项-v 或--invert-match,
ls -R |grep -v -E .*[\.exe]$\|.*[\.html]$
【讨论】:
-v/--invert-match不一定会翻转grep的返回码是否表示执行成功,而是会匹配不匹配的行。那些希望反转返回代码的人(即,如果所有行都不匹配模式,而不是至少一个)应该使用! grep。这可用于条件表达式,例如:if ! ls | grep -qE ".(\.exe)$"; then echo No .exe files in $(pwd); fi。
ls -R | grep -v -E ".*(\.exe)$|.*(\.vue)$"
grep -v
或
grep --invert-match
你也可以使用find来做同样的事情:
find . -type f \( -iname "*" ! -iname ".exe" ! -iname ".html"\)
更多信息here.
【讨论】:
find 命令是这个 XY 问题最语义化的解决方案。为此目的将ls 和grep 组合起来似乎是最笨拙的。这应该是公认的答案。 (+1)
如多次所述,反转是通过-v 选项到grep 实现的。让我添加一个(希望是有趣的)注释,您可以通过搜索grep 帮助文本自己解决这个问题:
grep --help | grep invert
-v, --invert-match 选择不匹配的行
【讨论】:
将-v 选项添加到您的grep 命令以反转结果。
【讨论】:
grep "subscription" | grep -v "spec"
【讨论】: