여러 줄 awk 정규 표현식

여러 줄 awk 정규 표현식

text.txt다음을 고려하세요 :

blablabla    
&&&key word&&&
I want all 
these text and numbers 123
and chars !"£$%&
as output
&&&key word&&&
blablabla

awk다음 출력을 얻는 정규식을 구현하고 싶습니다 .

I want all 
these text and numbers 123
and chars !"£$%&
as output

저는 다음 표현을 사용하고 있습니다.

awk "$1 ~ /^[&&&key word&&&].[&&&key word&&&]/" test.txt

그러나 결과는 내가 기대했던 것과 다릅니다.

&&&key word&&&
&&&key word&&&

아마도 좋은 질문이 아닐 수도 있어서 죄송합니다. 여기에서 많은 솔루션을 시도했고 stackoverflow도 몇 가지 튜토리얼을 읽었지만 여전히 해결할 수 없습니다. 이 주제에 대한 완전한 튜토리얼도 제공해 주시면 정말 감사하겠습니다.

편집: 제안된 대로 $0을 사용하면 더 나은 결과를 얻을 수 있습니다.

awk "$0 ~ /[&&&key word&&&]/,/[&&&key word&&&]/" test.txt

결과 :

&&&key word&&&
I want all 
these text and numbers 123
and chars !"£$%&
as result
&&&key word&&&

여전히 첫 번째 행과 마지막 행을 삭제해야 합니다. 조건이 비슷한지는 알지만 awk "{if (NR!=1&&NR!=-1) {print}}" text.txt위 출력에 적용하는 방법을 모르겠습니다.

답변1

awk 'BEGIN {p=0}; /&&&key word&&&/ { p = ! p ; next } ; p { print }' file

이는 일치하는 두 인스턴스 사이의 행만 인쇄합니다 &&&key word&&&. 이 변수는 p인쇄할지 여부를 결정하는 플래그로 사용됩니다. false로 시작하고(인쇄하지 않음) &&&key word&&&입력 줄에 일치하는 항목이 있을 때마다 논리적으로 부정(반전)됩니다.

입력 행 블록이 여러 개인 경우 &&&key word&&&해당 블록은 모두 인쇄됩니다(다른 블록은 인쇄되지 않음). 일치하는 시작 부분은 있지만 &&&key word&&&끝 부분이 없으면 파일 끝 부분까지의 모든 후속 행이 인쇄됩니다.

산출:

I want all 
these text and numbers 123
and chars !"£$%&
as output

시작 및 끝 키워드가 다른 경우(예: "START" 및 "STOP") 다음과 같이 할 수 있습니다.

awk 'BEGIN {p=0};
     /START/ { p = 1 ; next };
     /STOP/ { p = 0 ; next};
     p { print }' file

관련 정보