奇怪的grep行为

5
受这个问题的启发(这里),有人能解释以下行为吗?
$ echo“-uus”| grep -wo '[0]*' && echo matched
-uus
matched $ echo“-uus”| grep -o '[0]*' && echo matched 匹配
匹配 $ grep --version | sed 1q grep(GNU grep)2.5.1
特别是,为什么第二个grep成功了,但没有输出?第一个命令为什么有两行输出?我可以理解第二行输出的内容,但不理解第一行。

4
两种情况下我都只得到了“matched”。http://sprunge.us/RTfM - shadyabhi
1
我可以在几个不同的 shell 下(没有定义 GREP_OPTIONS)在 OS X 上重现 OP 的输出,使用 grep 2.5.1。 - DSM
Rob Mayoff在上述提到的问题的评论中表示,他在grep 2.5.1上没有遇到相同的行为,因此旧版grep可能不是一个bug。DSM在OSX上也遇到了相同的行为,因此操作系统某种程度上是相关的。也许构建不同。 - William Pursell
1
@WilliamPursell:是的,那是我几年前发现的错误。新版本的grep不应该出现这种行为。 - choroba
可以在OSX 10.7.2上使用2.5.1重现,但来自MacPorts的版本(2.10)按预期工作。 - johnsyweb
显示剩余6条评论
2个回答

3

1

问题:为什么grep成功了,但没有输出?

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

答案:

模式[0]*表示至少零个字符。因此,即使匹配的文本为空,grep也会认为它找到了它。使用选项-ogrep不会打印空匹配字符串。手册页面上写道:

-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

然而,当未使用选项-o时,grep甚至会打印空行:

$ 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 中的一个 bug。


是的,但如果grep使用-o匹配空字符串,它似乎应该输出一个空行而不是什么都不输出。 - William Pursell
我同意 echo | grep '' 会打印出一个空行。而 echo | grep -o '' 则不会打印任何东西。但是这是正确的:选项 -o 不会打印空的匹配字符串。感谢您指出这一点。我已经更新了我的答案。干杯;-) - oHo
嗨@WilliamPursell。感谢您的评论=>我已更新我的答案。希望这个奇怪的grep行为现在对您来说是清晰的;-)再见。干杯。 - oHo

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