grep --ignore-case --only


74

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

我正在使用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],但这似乎不是一个好的选择。

Answers:


46

这是最初的2.5.1上的一个已知 错误,根据该错误报告,该错误已在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。


肯尼,谢谢!您所说的确实有道理,将尝试更新。
schatten

11

您的grep版本中应该有问题。

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

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

我的版本是:

$ grep --version
grep (GNU grep) 2.10

1
对我的作品在2.5.1在Red Hat企业版Linux 5
迈克尔·霍夫曼

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

0

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

输出echo "ABC" | grep -i abcABC-o显示输出匹配“ abc”,因此无显示:

Naos:~ mattlacey$ echo "ABC" | grep -i abc | grep -o abc
Naos:~ mattlacey$ echo "ABC" | grep -i abc | grep -o ABC
ABC
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.