
改行で区切られた長い文字列があり、各部分は(~
ファイルに他の文字列がない)で始まる文字列で区切られています。 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
-z
pcregrep代わりに:
$ pcregrep -Mo 'xyz(?:.*\n)*?\K~this' file
~this
答え2
cat "$file" | grep xyz -A 10000 | grep \~ -m1
または等しく、
grep -A 10000 xyz "$file" | grep -m1 '~'