앗

유사하지만 완전히 동일하지는 않습니다.두 패턴(포함) 사이에서 첫 번째 발생을 선택하는 방법...다음 입력 파일이 제공됩니다.

something P1 something
content1
content2
something P1 something
content3
content4

다음 출력이 필요합니다.

something P1 something
content1
content2

답변1

이상한 해결책 :

 awk '/^something P1 something$/{if(++i>1)exit} i' input_file

그러면 일치하는 첫 번째 줄 /^something P1 something$/과 패턴과 일치하는 다음 줄(해당 줄은 포함하지 않음) 또는 파일 끝까지의 모든 줄이 인쇄됩니다.

답변2

나는 이것이 당신이 정말로 원하는 것이라고 생각합니다.

첫 번째 블록을 인쇄합니다.

$ awk '$0=="something P1 something"{c++} c==1' file
something P1 something
content1
content2

또는 두 번째 것을 인쇄하십시오.

$ awk '$0=="something P1 something"{c++} c==2' file
something P1 something
content3
content4

등. 명시적인 요구 사항이 없으면 이는 단지 추측일 뿐입니다.

답변3

 $ sed -ne '
     /P1/!d
     :loop
        p;n
     //!bloop
     q
 ' file 

결과:

something P1 something1
content1
content2

Posix가 아닌 구문과 함께 Gnu sed 편집기 사용 Q:

$ sed -e '
   /P1/,/P1/!d
   //!{$q;b;}
   G;/\n./Q;s/\n.*//;h
' file

Posix 전용 구성의 경우 다음을 수행합니다.

 $ sed -ne '
      /P1/,/P1/!d
      //!{
        p;$q;d
      }
      G;/\n./q;s/\n.*//p;h
 ' file

펄 사용:

$ perl -lne '
    next unless $e = /P1/ ... /P1/;
    $e =~ /E/ ? last : print;
' file

그 후에는 다음이 있습니다.

$ perl -0777 -pe '$_ = /^(.*?P1(?s:.*?\n))(?=.*?P1)/m ? $1 : $,' file

답변4

i번째 패턴에 대한 일반 솔루션막힌awk에서는 다음과 같습니다.

awk -v i=1 -v pat='something P1 something'    '$0~pat{i--}i==0'

설명하다:

-v i=1        # sets the pattern block to print (1 in this case).
-v pat='...'  # sets the regex pattern that will be tested.

$0~pat        # tests if the input line match the pattern
{i--}         # If the pattern was found, reduce the count.
i==0          # If the count has reduced to 0, print the block lines.

중요한 모드가 P1인 경우 다음을 사용하십시오.

awk -v i=1 -v pat='P1' '$0~pat{i--}i==0'

더 빠르게 실행하려면 블록 끝에서 종료하세요.

awk -v i=1 -v pat='P1' '$0~pat{i--}i==0;i<0{exit}'

당신이 하나를 원한다면단어(패턴 아님) 일치시키려면 다음을 사용하십시오.

awk -v i=1 -v pat='P1' '$0 == pat {i--}; i==0; i<0{exit}'

sed

~부터 시작하다첫 번째패턴의 한 인스턴스에서 다음 인스턴스로 GNU sed에서 다음을 수행할 수 있습니다.

sed -n '/something P1 something/!b;b2;:1;{/something P1 something/q;:2;p;n;b1}'

첫 번째 줄 앞에 몇 줄이 있을 수 있습니다 something P1 something.
두 번째 패턴이 발견되면 스크립트가 (빠르게) 중지됩니다.

두 모드(시작 및 종료)가 동일하므로 명령을 다음과 같이 단순화할 수 있습니다.

sed -n -e '/something P1 something/!b;b2;:1;{//q;:2;p;n;b1}'

이식성을 높이려면 다음을 사용하십시오.

sed -n -e '/something P1 something/!{b' -e '};b2' -e ':1' -e '{//q;:2' -e 'p;n;b1' -e '}'

관련 정보