提问人:William Pursell 提问时间:2/5/2012 最后编辑:CommunityWilliam Pursell 更新时间:10/19/2012 访问量:352
奇怪的 grep 行为
Odd grep behavior
问:
受到这个问题的启发,谁能解释以下行为?
$ 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 成功了,但没有产生任何输出?为什么第一个命令有两行输出?我可以理解输出的第二行,但我不理解第一行。
答:
1赞
oHo
2/5/2012
#1
问题:为什么成功了,却没有产生任何输出?grep
$ echo "-uus" | grep -o '[0]*' && echo matched
matched
答:
该模式表示至少为零个字符。所以说它找到了它,即使匹配的文本是空的。 与选项一起使用不打印空的匹配字符串。页面说:[0]*
grep
grep
-o
man
-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
评论
matched
grep
grep
GREP_OPTIONS