여러 줄에서 여러 패턴을 찾기 위해 grep하는 방법은 무엇입니까?

여러 줄에서 여러 패턴을 찾기 위해 grep하는 방법은 무엇입니까?

정확하게 말하면

Some text
begin
Some text goes here.
end
Some more text

"시작"부터 "끝"까지 전체 블록을 추출하고 싶습니다.

awk를 사용하면 이 작업을 수행할 수 있습니다.

awk '/begin/,/end/' text

무엇을 해야 합니까 grep? grep이를 수행할 수 있는 일부 *nix 구현이 있습니까 ?

답변1

grep, 이는 g/re/p기본 도구입니다.a와 일치하는 줄을 인쇄합니다.아르 자형정기적인이자형표현하다.

당신은 여기에 더 많은 것을 원합니다에스트레메편집하다이토:

sed '/^begin$/,/^end$/!d'

또는 이미 발견한 바와 같이 고급 언어를 사용하는 보다 일반적인 텍스트 처리 도구입니다 awk.perl

그러나 일부 grep구현은 조금 더 발전할 수 있습니다.

pcregrep -M '(?s)^begin$.*?^end$'

사용하고 있는 것여러 줄패턴( -M); 개행 문자도 일치 하도록 정규식에서 PCRE 플래그를 (?s)토글합니다 .s.

현재 버전에서는 합계가 20kiB(또는 지정된 버퍼 크기) 이상으로 분리되면 pcregrep제대로 작동하지 않을 수 있습니다 .beginend

예를 들어 다음과 같습니다.

(seq 12091; echo begin; seq 4315; echo end; seq 10) |
   pcregrep -M '(?s)^begin$.*?^end$'

하지만 다음에서는 그렇지 않습니다.

(seq 12091; echo begin; seq 4316; echo end; seq 10) |
   pcregrep -M '(?s)^begin$.*?^end$'

또는 grepPCRE를 지원하는 GNU 빌드를 사용하고 파일에 NUL 문자가 포함되어 있지 않다고 가정합니다.

grep -zoP  '(?ms)^begin$.*?^end$'

그러나 이는 검색을 시작하기 전에 전체 파일을 메모리에 로드한다는 의미 grep이므로 작은 파일 외에는 사용해서는 안 됩니다. 또한 출력에 NUL 문자를 추가합니다.

어쨌든 grep그렇죠아니요여기로 가는 것이 맞습니다.

관련 정보