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

관련 정보