GNU awk を使用すると、レコード セパレータを正規表現に設定できます。
<file awk 'NR==n+1 { print rt, $0 } { rt = RT }' RS='\\<category' ORS='' n=3
出力:
category
3
r
d
done
RT
一致したレコード区切りです。最初のレコードn
は最初のRS
.
編集
Ed のコメントによると、レコード間に他のデータがある場合、これは機能しません。
category
1
s
t
done
category
2
n
d
done
foo
category
3
r
d
done
bar
category
4
t
h
done
これを回避する 1 つの方法は、2 番目 (または最初) の awk で入力をクリーンアップすることです。
<file awk '/^category$/,/^done$/' |
awk 'NR==n+1 { print rt, $0 } { rt = RT }' RS='\\<category' ORS='' n=3
出力:
category
3
r
d
done
編集 2
Edがコメントで指摘したように、上記のメソッドは終了パターンを検索しません。これを行う1つの方法は、他の回答ではカバーされていませんが、次のとおりです( awk getlinegetline
にはいくつかの注意事項があることに注意してください):
<file awk '
/^category$/ {
v = $0
while(!/^done$/) {
if(!getline)
exit
v = v ORS $0
}
if(++nr == n)
print v
}' n=3
1 行で:
<file awk '/^category$/ { v = $0; while(!/^done$/) { if(!getline) exit; v = v ORS $0 } if(++nr == n) print v }' n=3