grep --ignore-case --only

时间:2011-12-14 01:07:34

标签: regex bash unix grep gnu

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

$ 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的错误还是我没有得到地图页面?

我使用的是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]之类的解决方法,但这似乎不是一个好的选择。

4 个答案:

答案 0 :(得分:44)

这是初始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。

答案 1 :(得分:9)

这应该是你的grep版本中的一个问题。

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

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

我的版本是:

$ grep --version
grep (GNU grep) 2.10

答案 2 :(得分:2)

如果您的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

答案 3 :(得分:0)

我建议-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