GNU grepの-oオプションは長さ0の一致を無視しますか?

GNU grepの-oオプションは長さ0の一致を無視しますか?

他のウェブサイトで提案された回答を見つけましたgrep -oP '^\w+|$。私はこれがPCREに意味がないことを指摘しました|$。これは単に「ORの終わり」を意味するからです。したがって、これは常に通常の行の場合です。しかし、grepGNU PCREで何をしているのかは不明です-o。以下を検討してください。

$ printf 'ab\na\nc\n\n' | perl -ne 'print if /ab|$/'
ab
a
c

$

$(結果に空白行が含まれていることを示すために、2番目のプロンプト()文字が含まれています。)

Perlが期待どおりにすべての行に一致します。 1つを含めるか、行の終わりと一致するabためです。$GNUはフラグなしでgrep同じように動作します-o

$ printf 'ab\na\nc\n\n' | grep -P 'ab|$'
ab
a
c

$

しかし、-o動作が変更されました。

$ printf 'ab\na\nc\n\n' | grep -oP 'ab|$'
ab
$

これは単にgrep forと同じですab。 2番目の部分「OR end of line」は無視されるようです。期待どおりに機能し、-oフラグはありません。

どうなりますか? - o0個の長さの一致を無視しますか?これはバグですか、それとも予想されますか?

答え1

私のGNU grepのマニュアルページは次のとおりです。

-o、--matchのみ

一致するものだけを印刷する(空ではない) はラインの一部と一致し、各部分は別々の出力ラインにあります。

ポイントは私です。

私は行末のマッチングを「ヌルマッチング」と見なしていると思います。

答え2

手術室の両側

2番目の部分「OR end of line」は無視されるようです。

いいえ、そうではありません。マッチングを少し変更すると、次のようになります。

$ printf 'ab\na\n\nc\n' | grep -oP 'ab|.$'
ab
a
c

二つの部分または明らかなマッチです。

空のマッチ

はい「空」の一致は無視されます(結果文字列の長さは0です)。

$ printf '%s\n' ab " " a "" c | grep -oP '^.*$'
ab

a
c

文書化されています(GNU grep)LESS=+'/^ *-o,' man grep(ハイライト):

-o、--matchのみ
Print only the matched (空ではない) parts of a matching line, with each such part on a separate output line.

関連情報