![我误解了 grep 手册中关于 -o (仅匹配)的内容](https://linux22.com/image/203553/%E6%88%91%E8%AF%AF%E8%A7%A3%E4%BA%86%20grep%20%E6%89%8B%E5%86%8C%E4%B8%AD%E5%85%B3%E4%BA%8E%20-o%20%EF%BC%88%E4%BB%85%E5%8C%B9%E9%85%8D%EF%BC%89%E7%9A%84%E5%86%85%E5%AE%B9.png)
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