여러 줄에 여러 패턴을 그 리핑하는 방법은 무엇입니까?


답변:


14

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

또한 \KLookbehind 어설 션 대신 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))를 사용하기 때문에 탈출 했습니다 .

남자 grep에서 :

-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.
Avinash Raj

DOTALL 수정자를 사용하여 줄 바꿈 문자와도 일치하도록 도트를 만듭니다.grep -Pzo "(?s)begin.*?end" file
Avinash Raj

또는 간단히,grep -Pzo "begin[\s\S]*?end" file
Avinash Raj

1
siólution이 작동하지 않습니다. 오류가 발생합니다. 오류 grep: ein nicht geschütztes ^ oder $ wird mit -Pz nicht unterstützt의 번역은 다음과 같습니다.grep: a not protected ^ or $ is not supported with -Pz
musbach

1
네, 알고 있습니다. 이 글을 올렸을 때 효과가 있었지만 오늘 다시 시도하십시오. 동작 grep이 변경된 것 같습니다.
terdon

2

grep펄 구문 ( -P)을 지원하지 않는 경우 선을 결합하고 패턴을 일치시킨 다음 아래처럼 선을 다시 확장 할 수 있습니다.

$ tr '\n' , < foo.txt | grep -o "begin.*end" | tr , '\n'
begin
Some text goes here.
end
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.