扩展 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使用-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 '~'

相关内容