정확하게 말하면
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
제대로 작동하지 않을 수 있습니다 .begin
end
예를 들어 다음과 같습니다.
(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$'
또는 grep
PCRE를 지원하는 GNU 빌드를 사용하고 파일에 NUL 문자가 포함되어 있지 않다고 가정합니다.
grep -zoP '(?ms)^begin$.*?^end$'
그러나 이는 검색을 시작하기 전에 전체 파일을 메모리에 로드한다는 의미 grep
이므로 작은 파일 외에는 사용해서는 안 됩니다. 또한 출력에 NUL 문자를 추가합니다.
어쨌든 grep
그렇죠아니요여기로 가는 것이 맞습니다.