일치하는 조건 사이에서 파일의 텍스트 일부를 추출하는 방법

일치하는 조건 사이에서 파일의 텍스트 일부를 추출하는 방법

아래와 같은 파일이 있습니다.

~PAR1~
This is Par1 line 1
This is Par1 line 2

Par Finished

~PAR2~
This is Par2 line 1
This is Par2 line 2

Par Finished

를 통과하면 과 사이의 모든 줄을 PAR1가져와야 합니다 . 어떻게 얻을 수 있나요? 조사 중이지만 옵션 을 찾을 수 없습니다.PAR1Par Finishedawksed

답변1

머리글과 바닥글 행을 원하는 경우 이는 간단합니다 sed .

sed -n "/^~PAR1~$/,/Par Finished/p"

변수와 함께 사용하는 것은 간단합니다.

START=PAR1
sed -n "/^~$START~$/,/Par Finished/p"

마지막 줄을 변수로 만들 수도 있습니다.

START=PAR1
END="Par Finished"
sed -n "/^~$START~$/,/$END/p"

결과는 다음과 같습니다.

~PAR1~
This is Par1 line 1
This is Par1 line 2

Par Finished

이제 시작/끝 줄이 필요하지 않고 빈 줄도 필요하지 않으면 상황이 좀 더 복잡해집니다.

아마도 더 좋은 방법이 있을 것입니다. 그러나 이것은 저에게 효과적입니다.

sed -n "/^~$START~$/,/$END/ { /^~$START~$/d ; /$END/d ; /^$/d ; p }"

이것의 결과는

This is Par1 line 1
This is Par1 line 2

답변2

해당 행(선택적 후행 공백 행 포함)을 레코드 구분 기호로 사용할 수 있습니다 Par Finished(그런 다음 이를 대체하여 레코드를 완료합니다).

awk -vRS='\nPar Finished\n*' -vp='PAR1' '$0 ~ p {print $0,"\nPar Finished"}' parfile
~PAR1~
This is Par1 line 1
This is Par1 line 2

Par Finished

awk가 있는 경우 GNU특수 변수를 사용하여 레코드 구분 기호를 복원할 수 있습니다 RT(원하는 경우 추가 개행 문자를 제거할 수도 있습니다).

gawk -vRS='\nPar Finished\n*' -vp='PAR1' '$0 ~ p {sub("\n*$", "", RT); print $0,RT}' parfile
~PAR1~
This is Par1 line 1
This is Par1 line 2

Par Finished

물론 통과할 필요가 없다면바꾸다 Par1간단한 정규식 범위를 사용합니다.

awk '/PAR1/,/Par Finished/' parfile
~PAR1~
This is Par1 line 1
This is Par1 line 2

Par Finished

답변3

충분히 작은 파일 grep입력 의 경우pcre

$ s="PAR1"

$ grep -oPz "(?s)[^\n]*${s}.*?\n.*?Par Finished.*?\n" ip.txt 
~PAR1~
This is Par1 line 1
This is Par1 line 2

Par Finished

패턴 사이의 선을 얻으려면:

$ grep -oPz "(?s)${s}.*?\n\K.*?(?=파 완료)" ip.txt
Par1 1호선 입니다
Par1 2호선 입니다

변수를 다음으로 변경하십시오.PAR2

$s="PAR2"
$ grep -oPz "(?s)${s}.*?\n\K.*?(?=파 완료)" ip.txt
Par2 1호선 입니다
Par2 2호선 입니다

인용하다: 여러 줄 검색을 위한 정규식(grep)

관련 정보