아래와 같은 파일이 있습니다.
~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.*?(?=Par 완료)" ip.txt Par1 1호선 입니다 Par1 2호선 입니다
변수를 다음으로 변경PAR2
$s="PAR2" $ grep -oPz "(?s)${s}.*?\n\K.*?(?=Par 완료)" ip.txt Par2 1호선 입니다 Par2 2호선 입니다