【问题标题】:How do I grep for "->"? [duplicate]我如何 grep 为“->”? [复制]
【发布时间】:2020-03-14 16:26:40
【问题描述】:

我想找出我使用过 lambda 表达式的 java 文件列表。为此,我想用 grep 查找表达式“->”。一些类似于我的查询得到了 grep 应该与 -F 选项一起使用的响应。当我这样做时:

grep -F "->" *.java

我收到错误消息:

grep: invalid option -- >

我正在使用 MacOS 达尔文。

【问题讨论】:

  • 简单,我会放弃 -F 并使用 grep '[-][>]'

标签: shell grep


【解决方案1】:

您可以使用\ 转义- 字符,如果您不转义它,它将被解释为命令行参数的指示符:grep "\->" *.java

【讨论】:

  • grep -F "\->" *.java 不会产生任何输出或错误消息。但是,grep "\->" *.java 给出了预期的结果。
  • @SeshadriR 抱歉,我什至没有查看-F 选项。我只是假设这不是你的问题的一部分。
【解决方案2】:

在关键字前加上双连字符:

grep -- '->' *.java

【讨论】:

    【解决方案3】:

    当您有“不安全”模式时,最好遵循该模式。它将减少解析错误的变化 - 它清楚地将选项与模式分开

    grep [options] -- "REGEXP" files
    

    在这种情况下

    grep -F -- "->" *.java
    

    【讨论】:

      【解决方案4】:

      POSIX specifies -e 选项。它可用于指定 多个 模式,但对于以连字符开头的单个模式也很有用:

      grep -e '->' *.java
      

      【讨论】:

        【解决方案5】:

        您总是可以做的就是将 奇怪的 符号封装在正则表达式括号中 ([])。

        $ grep '[-][>]' file
        

        这就是我在这种 OP 案例中会做的事情。有问题,OP现在确定问题出在哪里,是连字符(-)还是大于号(>),encapsulate

        然而,这里的问题是连字符。连字符通常表示命令/实用程序选项。实用程序grep 发现它的一个参数以连字符开头,说“嘿,这里有一个选项,让我们处理它”。它检查选项,看到>,然后说“抱歉,不能做!”

        出于上述原因,Posix 标准引入了双连字符,其要求如下:

        识别-- 的要求是因为符合要求的应用程序需要一种方法来保护其操作数免受实现可能作为扩展提供的任意选项的影响。例如,如果标准实用程序 foo 被列为不带任何选项,并且应用程序需要为其提供一个带有前导 的路径名,它可以安全地这样做:

        foo -- -myfile
        

        并避免将-m 用作扩展名的任何问题。

        来源:POSIX.1-2017 Utility Description Defaults

        Posix.1-2017 也将此作为您编写自己的实用程序时的指南:

        准则 10: 第一个不是选项参数的 -- 参数应被接受为指示选项结束的分隔符。任何以下参数都应被视为操作数,即使它们以 - 字符开头。

        来源:POSIX.1-2017 Utility Syntax Guidelines

        可以在BashFAQ 035 中看到该指南的实施。

        因此,问题的真正解决方案是:

        $ grep -- '->' file
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-01-25
          • 2021-11-07
          • 1970-01-01
          • 2014-06-17
          • 2017-02-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多