他のウェブサイトで提案された回答を見つけましたgrep -oP '^\w+|$
。私はこれがPCREに意味がないことを指摘しました|$
。これは単に「ORの終わり」を意味するからです。したがって、これは常に通常の行の場合です。しかし、grep
GNU 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
フラグはありません。
どうなりますか? - o
0個の長さの一致を無視しますか?これはバグですか、それとも予想されますか?
答え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.