奇怪的grep行为

时间:2012-02-04 20:55:27

标签: bash grep

this 问题的激励,任何人都可以解释以下行为吗?

$ 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成功,但没有产生输出?为什么第一个命令有两行输出?我可以理解第二行输出,但我不明白第一行。

2 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:1)

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

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

答案:

模式[0]*表示至少为零字符。所以即使匹配的文本为空,grep也会发现它。与选项grep一起使用的-o不会打印空匹配的字符串。 man页面上写着:

  

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

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

$ 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

中的错误