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

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

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

~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.*?(?=Par 완료)" ip.txt
Par1 1호선 입니다
Par1 2호선 입니다

변수를 다음으로 변경PAR2

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

참조: 여러 줄 검색을 위한 정규식(grep)

관련 정보