【问题标题】:How to invert a grep expression如何反转 grep 表达式
【发布时间】:2010-12-07 05:27:38
【问题描述】:

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

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

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

【问题讨论】:

    标签: regex linux grep


    【解决方案1】:

    使用命令行选项-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)$"
    【解决方案2】:
    grep -v
    

    grep --invert-match
    

    你也可以使用find来做同样的事情:

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

    更多信息here.

    【讨论】:

    • find 命令是这个 XY 问题最语义化的解决方案。为此目的将lsgrep 组合起来似乎是最笨拙的。这应该是公认的答案。 (+1)
    • @Eric 不管 OP 的要求如何,反转 grep 表达式的用途远不止查找文件。我怀疑这就是大多数人来这里的原因。
    【解决方案3】:

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

    grep --help | grep invert
    

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

    【讨论】:

      【解决方案4】:

      -v 选项添加到您的grep 命令以反转结果。

      【讨论】:

        【解决方案5】:
         grep "subscription" | grep -v "spec"  
        

        【讨论】:

          猜你喜欢
          • 2013-08-06
          • 1970-01-01
          • 1970-01-01
          • 2021-09-06
          • 2010-12-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多