아래와 같은 파일이 있습니다.
~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
가져와야 합니다 . 어떻게 얻을 수 있나요? 조사 중이지만 옵션 을 찾을 수 없습니다.PAR1
Par Finished
awk
sed
답변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)