awk 또는 sed를 사용하여 두 패턴 사이에서 텍스트 선택

awk 또는 sed를 사용하여 두 패턴 사이에서 텍스트 선택

아래와 같이 두 가지 모드 중에서 텍스트를 선택하고 싶습니다.

입력은 다음과 같습니다.

Blalala
'Omfoem From 
balanf PAT1 This is the
text that I want
to get PAT2: apples
Whatever: oranges

이것이 내가 원하는 결과입니다:

This is the
text that I want
to get

이 스크립트를 사용해 보았습니다.

awk '/^.*PAT1/{flag=1; next} /.*PAT2/{flag=0} flag' file1.txt

그러나 다음과 같은 결과만 출력됩니다.

text that I want

패턴과 같은 줄에 있는 텍스트 부분이 누락되었습니다.

저는 OSX를 사용하고 있습니다.

답변1

GNU* 변형, 레코드 구분 기호 , 필드 구분 기호를 awk만들고 마지막 필드를 인쇄하여 출력이 중복 결과가 아닌지 확인합니다.PAT2RSPAT1FSNFRS

awk 'BEGIN{RS="PAT2"; FS="PAT1"}NF>1{print $NF}' file1
 This is the
text that I want
to get 

 This is another text that I want
to get DONE

*@EdMorton이 언급함

답변2

GNU의 경우 sed보기 흉하기는 하지만 해결될 수 있다고 생각합니다.

sed -e 's/PAT1/\nPAT1\n/' -e 's/PAT2/\nPAT2\n/' file | sed -n '/PAT1/,/PAT2/{//!p}'

PAT1 및 PAT2를 가져오고 시작과 끝에 개행을 추가합니다.

sed -e 's/PAT1/\nPAT1\n/' -e 's/PAT2/\nPAT2\n/'

Blalala
'Omfoem From 
balanf 
PAT1
 This is the
text that I want
to get 
PAT2
: apples

PAT1과 PAT2 사이의 텍스트를 인쇄합니다.

sed -n '/PAT1/,/PAT2/{//!p}'

 This is the
text that I want
to get 

답변3

모든 UNIX 시스템의 모든 쉘에서 awk를 사용하십시오.

$ awk 'sub(/.*PAT1 */,""){f=1} f{if ( sub(/ *PAT2.*/,"") ) f=0; print}' file
This is the
text that I want
to get

위 내용은 귀하가 제공한 예제 입력에 대해 작동합니다. 이것이 적용되지 않는 다른 형식의 다른 입력(예: 중첩된 시작/끝 문자열 또는 같은 줄의 끝 문자열 다음에 오는 시작 문자열)이 있는 경우 질문을 편집하십시오. 이것을 나타냅니다.

답변4

GNU와 함께grep(1)

grep -zoP "(?s)(?<=PAT1 )(.*)(?= PAT2)" file

시험

$ cat file
Blalala
'Omfoem From
balanf PAT1 This is the
text that I want
to get PAT2: apples
Whatever: oranges

$ grep -zoP "(?s)(?<=PAT1 )(.*)(?= PAT2)" file
This is the
text that I want
to get

~에서grep(1)매뉴얼 페이지

-z, --null-data
  Treat the input as a set of lines, each terminated by  a  zero  byte  (the  ASCII NUL  
  character) instead  of  a  newline.  Like the -Z or --null option, this option can be 
  used with commands like sort -z to process arbitrary file names.

-o, --only-matching
   Print  only  the  matched  (non-empty) parts of a matching line, with each such part 
   on a separate output line.

-P, --perl-regexp
   Interpret PATTERN as a Perl regular expression (PCRE, see below).  This is highly 
   experimental and grep -P may warn of unimplemented features.

정규식 설명:

(?s)activate 는 문자나 개행 문자를 찾는다는 PCRE_DOTALL의미입니다 ..

Positive Lookbehind 어설션 (?<=PAT1 )과 Positive Lookahead 어설션을 사용하면 (?= PAT2)캡처링 그룹만 인쇄됩니다 (.*).

이 솔루션에 대한 참고 사항:

@bushman이 말했듯이 이는 두 패턴이 모두 파일에 정확히 한 번만 존재하는 경우에만 작동합니다.

관련 정보