我误解了 grep 手册中关于 -o (仅匹配)的内容

我误解了 grep 手册中关于 -o (仅匹配)的内容

grep手动报价:

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

matched (non-empty) parts of a matching line方法非空行正确的?

更新

如果评论被删除,请参考下面斯蒂芬的回答:

  • 解释:“一行中的空字符串”而不是“匹配行的空部分”怎么样? – 拉霍尔 10 小时前
  • 我认为重要的标签是“配套件”; “匹配的字符串”也可以,我不是问哪个更好的人。 – 斯蒂芬·基特 59 分钟前

答案1

它实际上指的是匹配行的非空匹配部分,而不是非空行。这结果是输出仅包含非空行,每行包含一个非空匹配。

grep -o每场比赛打印一行:

$ grep -Eo '.?' <<<"hello"
h
e
l
l
o

但它不输出空匹配。许多正则表达式可以匹配空文本;例如:

$ grep -E '.?' <<<""

输出一个空行,因为空行匹配。然而,添加-o结果根本没有输出:

$ grep -Eo '.?' <<<""

因为-o忽略空匹配。

指定-o忽略空匹配意味着实现者不需要决定如何处理零长度匹配,否则在许多情况下会产生相当冗长(且无用)的输出。

答案2

考虑这两个命令:

grep -o '^' <<<'1a2b3c'

这不会输出任何内容,因为它与行的开头匹配并且是空的,所以它不会输出它。


grep -o '[abc]' <<<'1a2b3c'

这输出匹配行的匹配(非空)部分,每个这样的部分都在单独的输出行上。

a
b
c

相关内容