奇怪的 grep 行为

Odd grep behavior

提问人:William Pursell 提问时间:2/5/2012 最后编辑:CommunityWilliam Pursell 更新时间:10/19/2012 访问量:352

问:

受到这个问题的启发,谁能解释以下行为?

$ echo "-uus" | grep -wo '[0]*' && echo matched
-uus

matched
$ echo "-uus" | grep -o '[0]*' && echo matched
matched
$ grep --version | sed 1q
grep (GNU grep) 2.5.1

特别是,为什么第二个 grep 成功了,但没有产生任何输出?为什么第一个命令有两行输出?我可以理解输出的第二行,但我不理解第一行。

bash grep

评论

4赞 shadyabhi 2/5/2012
我只在这两种情况下得到。sprunge.us/RTfMmatched
0赞 rob mayoff 2/5/2012
你确定你还没有创建一个名为(大概调用真实)的别名或 shell 函数吗?你的环境中有吗?grepgrepGREP_OPTIONS
1赞 DSM 2/5/2012
我可以在几个 shell(没有定义GREP_OPTIONS)下重现 OS X 上的 OP 输出 grep 2.5.1。
0赞 William Pursell 2/5/2012
这发生在 OS X (10.8.0) 上,grep 是 /usr/bin/grep,GREP_OPTIONS未定义。我不明白操作系统有什么关系。
1赞 choroba 2/5/2012
@WilliamPursell:是的,这是我几年前发现的错误。较新版本的 grep 不应表现出此类行为。

答:

1赞 oHo 2/5/2012 #1

问题:为什么成功了,却没有产生任何输出?grep

$ echo "-uus" | grep -o '[0]*' && echo matched
matched

答:

该模式表示至少为零个字符。所以说它找到了它,即使匹配的文本是空的。 与选项一起使用不打印空的匹配字符串。页面说:[0]*grepgrep-oman

-o, --only-matching
仅打印匹配行的匹配(非空)部分,每个此类部分位于单独的输出行上。

您甚至可以使用空模式,它输出相同的内容:

$ echo "-uus" | grep -o '' && echo matched 
matched

您还可以测试:

$ echo    | grep -o '' && echo matched || echo unmatched
matched
$ echo -n | grep -o '' && echo matched || echo unmatched
unmatched

但是,当不使用该选项时,甚至会打印空行:grep-o

$ echo    | grep '' && echo matched || echo unmatched

matched


问:为什么第一个命令有两行输出?

$ echo "-uus" | grep -wo '[0]*' && echo matched
-uus

matched
$ grep --version | sed 1q
grep (GNU grep) 2.5.1

答:

看起来像一个错误GNU grep 2.5.1

评论

0赞 William Pursell 2/5/2012
是的,但是如果 grep 将空字符串与 -o 匹配,它似乎应该输出一个空行而不是什么都不输出。
0赞 oHo 2/5/2012
我同意打印一个空行。而不是什么都不打印。但这是正确的:选项不打印空的匹配字符串。谢谢你指出这一点。我更新了我的答案。干杯;-)echo | grep ''echo | grep -o ''-o
0赞 oHo 2/5/2012
嗨,@WilliamPursell。感谢您的评论=>我已经更新了我的答案。我希望这种怪异的行为现在对你来说很清楚;-)再见。干杯。grep
3赞 choroba 10/19/2012 #2

旧版本中存在错误。我在这里报告了一个:grep

https://bugzilla.redhat.com/show_bug.cgi?id=144980

较新版本不再出现此问题。grep