最初の一致後に一致を見つけるには、grepを展開してください。

最初の一致後に一致を見つけるには、grepを展開してください。

改行で区切られた長い文字列があり、各部分は(~ファイルに他の文字列がない)で始まる文字列で区切られています。 grepを展開して一致のすぐ下のテキストを~見つけたいと思います。~

入力する:

abc
ads
acb
abc
acsa
acfs
~notthis
abc
ads
acb
xyz                <-- pattern
acsa
acfs
~this              <-- output
abc
ads
acb
abc
acsa
acfs
~no

検索時の出力xyz:

~ this

私はawk次のことをします。

awk '/xyz/{x=1}x&&/~/{print;exit}' file

しかし、パフォーマンス上の利点がある場合はgrepを使用したいと思います。

答え1

少なくともGNUの場合grep 2.12

$ grep -Pzo 'xyz(?:.*\n)*?\K~this' file
~this

あなたのバージョンで許可されてgrepいない場合は、次のものを使用できます。-P-zpcregrep代わりに:

$ pcregrep -Mo 'xyz(?:.*\n)*?\K~this' file
~this

答え2

cat "$file" | grep xyz -A 10000 | grep \~ -m1

または等しく、

grep -A 10000 xyz "$file" | grep -m1 '~'

関連情報