使用awk或sed查找特定模式并打印完整文本块

edl*_*oaa 5 regex awk sed

如何在文本块中找到特定的数字并打印以关键字开头并以?结尾的完整文本块?基本上这是我的文件的样子:"BEGIN""END"

BEGIN
A: abc
B: 12345
C: def
END

BEGIN
A: xyz
B: 56789
C: abc
END

BEGIN
A: ghi
B: 56712
C: pqr
END

[...]
Run Code Online (Sandbox Code Playgroud)

如果我在寻找'^B: 567',我想得到这个输出:

BEGIN
A: xyz
B: 56789
C: abc
END

BEGIN
A: ghi
B: 56712
C: pqr
END
Run Code Online (Sandbox Code Playgroud)

我可以在这里使用grep(grep -E -B2 -A2 "^B: 567" file),但我希望得到一个更通用的解决方案.我想awksed可能会这样做!?

谢谢!:)

Ed *_*ton 7

$ awk -v RS= -v ORS='\n\n' '/\nB: 567/' file
BEGIN
A: xyz
B: 56789
C: abc
END

BEGIN
A: ghi
B: 56712
C: pqr
END
Run Code Online (Sandbox Code Playgroud)

注意\n之前B确保它出现在^一行的开头.这取代了你原来的字符串开头字符,因为现在每一行都不是它自己的字符串.您需要在上面设置ORS以重新插入记录之间的空白行.


pot*_*ong 5

这可能对您有用(GNU sed):

sed -n '/^BEGIN/{x;d};H;/^END/{x;s/^B: 567/&/mp}' file
Run Code Online (Sandbox Code Playgroud)

或这个:

sed -n '/^BEGIN/!b;:a;$!{N;/\nEND/!ba};/\nB: 567/p' file
Run Code Online (Sandbox Code Playgroud)