아래와 같이 두 가지 모드 중에서 텍스트를 선택하고 싶습니다.
입력은 다음과 같습니다.
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
만들고 마지막 필드를 인쇄하여 출력이 중복 결과가 아닌지 확인합니다.PAT2
RS
PAT1
FS
NF
RS
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이 말했듯이 이는 두 패턴이 모두 파일에 정확히 한 번만 존재하는 경우에만 작동합니다.