【问题标题】:grep --ignore-case --onlygrep --ignore-case --only
【发布时间】:2012-01-19 20:51:24
【问题描述】:

同时使用 --ignore-case 和 --only-match 选项时,grep 失败。 示例:

$ echo "abc" | grep -io abc
abc
$ echo "ABC" | grep -io abc
$ 

但是

$ echo "abc" | grep -i abc
abc
$ echo "ABC" | grep -i abc
ABC

根据手册页:

   -o, --only-matching
          Show only the part of a matching line that matches PATTERN.
   -i, --ignore-case
          Ignore case distinctions in both the PATTERN and the input files.

是grep的bug还是我没有得到地图页面?

我使用的是 Mac OS X 10.6.8 和

$ grep --version
grep (GNU grep) 2.5.1

找到这个链接:http://lists.gnu.org/archive/html/bug-gnu-utils/2003-11/msg00040.html

当然可以使用grep -o [aA][bB][cC] 之类的解决方法,但这似乎不是一个好的选择。

【问题讨论】:

    标签: regex bash unix grep gnu


    【解决方案1】:

    这可能是您的 grep 版本的问题。

    您的测试用例在我的机器上运行正常:

    $ echo "abc" | grep -io abc
    abc
    $ echo "ABC" | grep -io abc
    ABC
    

    我的版本是:

    $ grep --version
    grep (GNU grep) 2.10
    

    【讨论】:

    • 在 Red Hat Enterprise Linux 5 上的 2.5.1 上为我工作。
    • 看起来我已经安装了 Red Hat 2.5.1-55,所以这是在 @KennyTM 报告的错误修复之后。
    【解决方案2】:

    我建议-i 表示它确实匹配“ABC”,但区别在于输出。 -i 不操纵输入,因此它不会将“ABC”更改为“abc”,因为您将“abc”指定为模式。 -o 说它只显示与指定模式匹配的输出部分,它没有说匹配输入。

    echo "ABC" | grep -i abc 的输出是ABC-o 显示输出匹配“abc”所以什么都没有显示:

    Naos:~ mattlacey$ echo "ABC" | grep -i abc | grep -o abc
    Naos:~ mattlacey$ echo "ABC" | grep -i abc | grep -o ABC
    ABC
    

    【讨论】:

      【解决方案3】:

      这是最初 2.5.1 上的 known bug,根据错误报告,已在 2007 年初(Redhat 2.5.1-5)修复。不幸的是,即使在 Mac OS X 10.7.2 上,Apple 仍在使用 2.5.1。

      您可以通过Homebrew (3.0)MacPorts (2.26)fink (3.0-1) 获得更新版本。


      编辑:显然它已在 OS X 10.11(或更早版本)上修复,即使报告的 grep 版本仍为 2.5.1。

      【讨论】:

      • 肯尼,谢谢!你说的有道理,会努力更新的。
      【解决方案4】:

      如果您的 grep -i 不起作用,请尝试使用 tr 命令将文件的输出转换为小写,然后使用您要查找的任何内容将其通过管道传输到标准 grep。 (听起来很复杂,但我为您提供的实际命令并不复杂!)。

      请注意,tr 命令不会更改原始文件的内容,它只是在将其提供给 grep 之前对其进行转换。

      1.这是您如何在文件上执行此操作的方法

      tr '[:upper:]' '[:lower:]' <your_file.txt|grep what_ever_you_are_searching_in_lower_case
      

      2.或者在你的情况下,如果你只是在呼应一些东西

      echo "ABC"|tr '[:upper:]' '[:lower:]' | grep abc
      

      【讨论】:

      • 它不改变内容,但它改变了管道流,所以你不会得到文件的原始匹配内容。
      猜你喜欢
      • 2012-11-28
      • 1970-01-01
      • 1970-01-01
      • 2017-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-29
      • 1970-01-01
      相关资源
      最近更新 更多