awk / sedを使用してパターンに一致するブロックのテキストを印刷する

awk / sedを使用してパターンに一致するブロックのテキストを印刷する

以下のテキストがあります。ABC:CDA*とを含むブロックを印刷しますfgh:qwe

Awkで試しましたが、すべてのデータが印刷されました。

awk -n  -v RS='' -v ORS='\n\n' 'match($0,".*fgh:qwe[^\n]*") { print substr($0,1,RLENGTH) }'

入力する:

ABC:CDA_sd
dfg:GFJ
dfg:jasdn
iop:yui
ghj:bhu
ghj:poi
fgh:qwe

axy:ABC_gf
dfg:GFJ
dfg:jasdn
iop:yui
ghj:bhu
ghj:poi
fgh:qwe

ABC:CDA_ghg
dfg:GFJ
dfg:jasdn
iop:yui
ghj:bhu
ghj:poi
fgh:qwe

ABC:CDA_jsagdh
dfg:GFJ
dfg:jasdn
iop:yui
ghj:bhu
ghj:poi
fgh:qwe

出力:

ABC:CDA_sd
dfg:GFJ
dfg:jasdn
iop:yui
ghj:bhu
ghj:poi
fgh:qwe

ABC:CDA_ghg
dfg:GFJ
dfg:jasdn
iop:yui
ghj:bhu
ghj:poi
fgh:qwe

ABC:CDA_jsagdh
dfg:GFJ
dfg:jasdn
iop:yui
ghj:bhu
ghj:poi
fgh:qwe

答え1

努力する:

awk -v RS= '/^ABC:CDA.*fgh:qwe$/{ print sep $0; sep=ORS }' infile

答え2

出力フォーマットをより効果的に制御するには、Perlでショートモードを採用することをお勧めします。

perl -00nE 'say "$1" if /ABC:CDA(.*)fgh:qwe/s' example

Perl -00ne意味: 各段落ごと

答え3

GNUでテストされましたawk

awk '/^(axy:ABC_|ABC:CDA_)[[:lower:]]{2,6}$/ {check = ($1 == "axy:ABC_gf")} !check' file
ABC:CDA_sd
dfg:GFJ
dfg:jasdn
iop:yui
ghj:bhu
ghj:poi
fgh:qwe

ABC:CDA_ghg
dfg:GFJ
dfg:jasdn
iop:yui
ghj:bhu
ghj:poi
fgh:qwe

ABC:CDA_jsagdh
dfg:GFJ
dfg:jasdn
iop:yui
ghj:bhu
ghj:poi
fgh:qwe

または、次のデータのみを使用してください。


awk '/^(axy:ABC_|ABC:CDA_)[[:lower:]]{2,6}$/ {check = ($1 == "axy:ABC_gf")} check' file
axy:ABC_gf
dfg:GFJ
dfg:jasdn
iop:yui
ghj:bhu
ghj:poi
fgh:qwe

関連情報