5

テキスト ブロック内の特定の数字を見つけて、キーワードで始まり で終わる完全なテキスト ブロックを印刷するにはどうすればよいでしょうか? 基本的に、これは私のファイルがどのように見えるかです:"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でこれができると思います! ?

ありがとう!:)

4

6 に答える 6

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
于 2013-10-08T20:46:52.487 に答える
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
于 2013-10-08T20:42:00.317 に答える