如何在文本块中查找特定数字并打印完整文本块,以关键字"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
[...]
如果我正在寻找'^B: 567'
,我想得到这个输出:
BEGIN
A: xyz
B: 56789
C: abc
END
BEGIN
A: ghi
B: 56712
C: pqr
END
我可以在这里使用grep( grep -E -B2 -A2 "^B: 567" file
),但我希望得到一个更通用的解决方案。我猜 awk 或 sed 可能会这样做!?
谢谢! :)
答案 0 :(得分: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
请注意\n
之前的B
,以确保它出现在行的开头。这取代了您原来从现在开始的^
字符串开头字符line不是它自己的字符串。您需要在上面设置ORS以重新插入记录之间的空行。
答案 1 :(得分:4)
这可能适合你(GNU sed):
sed -n '/^BEGIN/{x;d};H;/^END/{x;s/^B: 567/&/mp}' file
或者这个:
sed -n '/^BEGIN/!b;:a;$!{N;/\nEND/!ba};/\nB: 567/p' file
答案 2 :(得分:2)
您可以取消RS
分隔空行中的记录,并检查字符串是否与整个块匹配:
awk 'BEGIN { RS = "" } /\nB:[[:space:]]+567/ { print $0 ORS }' infile
它产生:
BEGIN
A: xyz
B: 56789
C: abc
END
BEGIN
A: ghi
B: 56712
C: pqr
END
答案 3 :(得分:2)
这个awk应该可以工作:
awk -v s='B: 567' '$0~s' RS= file
BEGIN
A: xyz
B: 56789
C: abc
END
BEGIN
A: ghi
B: 56712
C: pqr
END
答案 4 :(得分:2)
有点长,但RS技巧已经发布: - )
BEGIN {found=0;start=0;i=0}
/BEGIN/ {
start=1
delete a
}
/.*567.*/ {found=1}
{
if (start==1) {
a[i++]=$0
}
}
/END/ {
if (found) {
for (i in a)
print a[i]
}
found=0
start=0
delete a
}
输出:
$ awk -f s.awk input
BEGIN
A: xyz
B: 56789
C: abc
END
BEGIN
A: ghi
B: 56712
C: pqr
END
答案 5 :(得分:0)
perl -lne 'if(/56789/){$f=1}
push @a,$_;
if(/END/){
if($f){print join "\n",@a}
undef @a;$f=0}' your_file