次のファイルをインポートします。
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-count
grep
注:目的の結果を得るためのより良いツールがあることを知っていますが、sed
ここでは代替ソリューションを探していません。私の質問はpcregrep
ORについてです。オプション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つを使用することが重要です。