受 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成功,但没有产生输出?为什么第一个命令有两行输出?我可以理解第二行输出,但我不明白第一行。
答案 0 :(得分:3)
答案 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