我在另一个建议的网站上找到了答案grep -oP '^\w+|$
。我指出这|$
在 PCRE 中是没有意义的,因为它只是意味着“或行尾”,因此对于常规行总是如此。但是,grep
当与-o
. 考虑以下:
$ printf 'ab\na\nc\n\n' | perl -ne 'print if /ab|$/'
ab
a
c
$
(我包括第二个提示符 ( $
) 以显示空行包含在结果中)。
正如预期的那样,在 Perl 中,这将匹配每一行。要么是因为它包含一个,要么是ab
因为$
匹配了行尾。没有标志的GNUgrep
的行为方式相同:-o
$ printf 'ab\na\nc\n\n' | grep -P 'ab|$'
ab
a
c
$
但是,-o
改变了行为:
$ printf 'ab\na\nc\n\n' | grep -oP 'ab|$'
ab
$
这与简单地 grepping for 相同ab
。第二部分,“或行尾”似乎被忽略了。-o
没有标志,它确实可以按预期工作:
这是怎么回事?是否 -o
忽略 0 长度匹配?这是一个错误还是预期的?
我的 GNU grep 手册页显示以下内容:
重点是我的
我猜它认为行尾匹配是“空匹配”
OR 的两侧
第二部分,“或行尾”似乎被忽略了。
不,不是,如果我们稍微改变匹配:
OR的两个部分都是显式匹配的。
空匹配
忽略的是“空”匹配(结果字符串的长度为零):
它记录在案(在 GNU grep 中)
LESS=+'/^ *-o,' man grep
(强调我的):