How can find a specific number in a text block and print the complete text block beginning with the key word "BEGIN"
and ending with "END"
? Basically this is what my file looks like:
BEGIN
A: abc
B: 12345
C: def
END
BEGIN
A: xyz
B: 56789
C: abc
END
BEGIN
A: ghi
B: 56712
C: pqr
END
[...]
If I was looking for '^B: 567'
, I would like to get this output:
BEGIN
A: xyz
B: 56789
C: abc
END
BEGIN
A: ghi
B: 56712
C: pqr
END
I could use grep here (grep -E -B2 -A2 "^B: 567" file
), but I would like to get a more general solution. I guess awk or sed might be able to do this!?
Thanks! :)
$ 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
Note the \n
before B
to ensure it occurs at the start of a line.This is in place of the ^
start-of-string character you had originally since now each line isn't it's own string. You need to set ORS above to re-insert the blank line between records.
This might work for you (GNU sed):
sed -n '/^BEGIN/{x;d};H;/^END/{x;s/^B: 567/&/mp}' file
or this:
sed -n '/^BEGIN/!b;:a;$!{N;/\nEND/!ba};/\nB: 567/p' file
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With