grep --ignore-case --only

91

当同时使用--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

根据man手册:

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

4个回答

53

这是一个关于最初的2.5.1版本的已知错误,根据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。


Kenny,谢谢!你说的有道理,我会尝试更新。 - schatten

19

可能是你使用的 grep 版本有问题。

在我的机器上,你的测试用例可以正常工作:

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

我的版本是:

$ grep --version
grep (GNU grep) 2.10

1
在 Red Hat Enterprise Linux 5 上,2.5.1 版本对我有效。 - Michael Hoffman
2
看起来我安装了Red Hat 2.5.1-55,所以这是在@KennyTM报告的错误修复之后。 - Michael Hoffman

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

它不会改变内容,但会改变管道流,因此您将无法获得文件的原始匹配内容。 - schatten

1

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接