특정 여러 줄 패턴부터 끝까지 파일 내용을 표시합니다.

특정 여러 줄 패턴부터 끝까지 파일 내용을 표시합니다.

여러 줄 모드에서 끝까지 파일 내용을 표시하는 방법패턴 자체를 포함하여?

얼마전에 비슷한 질문을 했는데 내용이 달라서 별도의 새로운 질문으로 올려볼까 생각중입니다. 그러니 단지 그것 때문에 이 중복 항목을 표시하지 마십시오!

예를 들어 다음과 같은 텍스트 파일이 있다고 가정해 보겠습니다.

cat
dog
fox
cow
dove
bird
bunny
gnu
hen
dove
bird
buffalo

내 스키마가 다음과 같은 경우:

dove
bird
bunny

내가 얻고 싶은 것은 :

dove
bird
bunny
gnu
hen
dove
bird
buffalo

내 실제 파일은 상당히 크기 때문에 이를 달성할 수 있는 방법이 여러 개 있는 경우 더 빠른 방법을 선호합니다.

답변1

패턴이 처음 나타날 때부터 인쇄를 시작하려면 쉽습니다. 내가 설명한 것과 동일한 논리에 따라또 다른 대답, 그러나 몇 가지 추가 논리가 있습니다.

파싱.sed

/^dove$/ {            # Match multi-line pattern
  N                   #  /
  N                   # /
  /\nbird\nbunny$/bb  # When matched jump to label b
}
d                     # Restart with next line if no match
:b                    # \
n                     #  Print the rest of the file
bb                    # /

다음과 같이 실행하세요:

sed -f parse.sed infile

또는 휴대용 단일 라이너로:

sed -n -e '/^dove$/{N;N;/\nbird\nbunny$/bb' -e '};d;:b' -e 'p;n;bb' infile

두 경우 모두 출력:

dove
bird
bunny
gnu
hen
dove
bird
buffalo

답변2

Perl 솔루션은 다음과 같습니다.

perl -0777 -ne 'print $1,$2 if m/(dove.bird.bunny)(.*)/sm' myfile

이 출력은 다음과 같습니다.

dove
bird
bunny
gnu
hen
dove
bird
buffalo

켜다-0777흡연전체 파일을 메모리로 읽는 모드입니다. sm일치 수정자를 사용하면 문자열을 여러 줄로 처리하면서 점 일치 개행이 가능합니다.

-n스위치는 입력 파일에 대한 읽기 루프를 생성합니다. 순서가 있을 때비둘기에 묶인 토끼$1보세요, 나머지 줄과 함께 캡처되고 $2전체 일치가 성공할 때 인쇄되는 내용입니다.

답변3

해결책:

awk -v RS=" " '{                        # considering space as record separator
                  for(i=1;i<=NF;i++) {  # iterating through all fields
                     if ($i=="dove" && $(i+1)=="bird" && $(i+2)=="bunny") { f=1 } 
                     if (f) print $i 
                  } 
               }' file

산출:

dove
bird
bunny
gnu
hen
dove
bird
buffalo

관련 정보