답변:
2016 년 11 월 18 일에 업데이트 됨 (grep 동작이 변경되었으므로 : -P 매개 변수가있는 grep은 이제 커널 v : 4.4.0-21-generic이있는 Ubuntu 16.04에서 지원되지 않음) ^
및 $
앵커 되지 않음 ( 잘못된 )
$ grep -Pzo "begin(.|\n)*\nend" file
begin
Some text goes here.
end
참고 : 다른 명령은 단지 새로운 라인 앵커와 '^'및 '$'앵커 교체에 대한 '\n'
______________________________
grep 명령으로 :
grep -Pzo "^begin\$(.|\n)*^end$" file
결과 "시작"및 "종료"를 포함시키지 않으려면 Lookbehind 및 Lookahead 지원과 함께 grep을 사용하십시오.
grep -Pzo "(?<=^begin$\n)(.|\n)*(?=\n^end$)" file
또한 \K
Lookbehind 어설 션 대신 notify를 사용할 수 있습니다 .
grep -Pzo "^begin$\n\K(.|\n)*(?=\n^end$)" file
\K
옵션은 패턴 일치 전에 모든 것을 무시하고 패턴 자체를 무시합니다.
\n
출력에서 빈 줄이 인쇄되지 않도록하는 데 사용됩니다.
또는 @ AvinashRaj는 다음과 같이 간단한 쉬운 grep이 있다고 제안합니다.
grep -Pzo "(?s)^begin$.*?^end$" file
grep -Pzo "^begin\$[\s\S]*?^end$" file
(?s)
grep에게 점이 개행 문자와 일치하도록 지시합니다.
[\s\S]
공백이거나 공백이 아닌 문자를 찾습니다.
"begin"과 "end"를 포함하지 않은 출력은 다음과 같습니다.
grep -Pzo "^begin$\n\K[\s\S]*?(?=\n^end$)" file # or grep -Pzo "(?<=^begin$\n)[\s\S]*?(?=\n^end$)"
grep -Pzo "(?s)(?<=^begin$\n).*?(?=\n^end$)" file
여기에서 모든 명령의 전체 테스트를 참조하십시오 ( -P 매개 변수를 사용하여 grep 동작이 변경됨에 따라 만료 됨 )
^
줄의 시작을 $
가리키고 줄 의 끝을 가리 킵니다. 이것들은 "시작"과 "끝"의 주위에 추가되어 그들이 한 줄에 혼자 있다면 그것들을 일치시키는 것입니다.
두 명령 에서 명령 출력이 명령 이름을 대체 할 수있는 $
"명령 대체"( $(command)
)를 사용하기 때문에 탈출 했습니다 .
-o, --only-matching
Print only the matched (non-empty) parts of a matching line,
with each such part on a separate output line.
-P, --perl-regexp
Interpret PATTERN as a Perl compatible regular expression (PCRE)
-z, --null-data
Treat the input as a set of lines, each terminated by a zero byte (the ASCII
NUL character) instead of a newline. Like the -Z or --null option, this option
can be used with commands like sort -z to process arbitrary file names.
grep -Pzo "(?<=begin\n)(.|\n)*(?=\nend)" file
를 인쇄하지 않도록 grep을 변경하십시오 \n
.
grep -Pzo "(?s)begin.*?end" file
grep -Pzo "begin[\s\S]*?end" file
grep: ein nicht geschütztes ^ oder $ wird mit -Pz nicht unterstützt
의 번역은 다음과 같습니다.grep: a not protected ^ or $ is not supported with -Pz
grep
이 변경된 것 같습니다.