pcregrep(またはpcre2grep)には、grepの--max-countオプションと同じ機能がありますか?

pcregrep(またはpcre2grep)には、grepの--max-countオプションと同じ機能がありますか?

次のファイルをインポートします。

aaa
bbb
XXX
ccc
ddd
eee
XXX
fff
ggg

印刷したい、そしてpcregrep、最初の行にすべての行が含まれるまでXXX

aaa
bbb
XXX

pcregrep(またはで)可能ですかpcre2grep

私はこれを実装しました:

$ pcre2grep -nM '(.|\n)*?XXX' file
1:aaa
bbb
XXX
4:ccc
ddd
eee
XXX

最初のゲームが終わったら終了する方法はありますか?同様のオプションがpcre2grepないようです。--max-countgrep

注:目的の結果を得るためのより良いツールがあることを知っていますが、sedここでは代替ソリューションを探していません。私の質問はpcregrepORについてです。オプションpcre2grepをシミュレートする方法があるかどうかを知りたいです。grep--max-count

ベストアンサー1

Debian 9(Stretch)を使用しているため、使用しているバージョンには10.22がpcre2-utils含まれていますpcre2grep。このバージョンには、特定の数の一致-m後に終了するオプションは含まれていません。--max-countつまり、あなたが望むもの(文字列印刷)は、あなたが持っているバージョンでは不可能です。

Debian 11(Bullseye)10.34に付属のバージョンにはこのオプションがあります。以下を使用して、予想される出力を達成する必要があるファイルでそれを使用できます。

pcre2grep -B2 -m1 XXX file

grepあなたの場合、Perl準拠の正規表現を使用する必要はないので、正規表現を使用してこれを行うこともできます。

grep -B2 -m1 XXX file

-nこのオプションは、期待される出力にない行番号だけを印刷するため、必要ではなく、前者は複数行に一致するように指示するため、-Mこのオプションと競合します。-m

上記のコマンドの出力:

aaa
bbb
XXX

文字列の最初の項目XXXとその前の2行を印刷します。ただし、行の先頭から文字列までの行数が正確にわかる必要があるため、この方法はお勧めできません。特定のファイルに問題はないかもしれませんが、ファイルに数千行または数百万行が含まれている場合は問題になります。

本質的にあなたが望むのは、ファイルの先頭から特定の文字列を含むすべてを印刷することです。grepデリバティブのどれもpcre2grepこの目的のために設計されておらず、信頼できる方法でそれ自体でこの結果を達成するオプションはありません。そのため、前述のsedものやawk前述のように、実際にこの目的のために設計されたツールを使用することをお勧めします。必要なものを得るために、より信頼性が高く、使いやすく、修正は不要で、出力を停止したい場所の前にいくつかの行があるかどうかを正確に知る必要もありません。使用目的でこれを行うこともできますが、pcre2grepより良いオプションがあることを認識し、それらの1つを使用することが重要です。

おすすめ記事