grep을 사용하여 여러 줄에서 패턴 일치를 찾는 방법

grep을 사용하여 여러 줄에서 패턴 일치를 찾는 방법

grep 파일 및 기타 유형의 입력에서 패턴과 문자열을 찾을 수 있는 명령줄 텍스트 검색 유틸리티입니다. 대부분의 일치 항목은 한 줄에만 일치하지만 여러 줄 바꿈을 일치시키는 데 유용한 경우가 많습니다.

grep으로 여러 줄 바꿈 일치

여러 줄 일치를 처리하는 것은 grep 그들이 고군분투하는 것입니다. 이 작업에 가장 적합한 도구는 여러 줄 입력을 자연스럽게 처리하는 awk 또는 입니다. sed사이에 쉼표가 있는 두 표현식을 사용하면 두 패턴 사이의 모든 것과 일치합니다.

awk '/from/,/to/' file

sed -n '/from/,/to/p' file

에서 여전히 이 작업을 수행할 수 grep있지만 명령이 매우 서투릅니다.

grep -Pz '(?s)from.*n.*to' test

이것은 여러 가지 작업을 수행합니다.

  • -PPerl 호환 정규식을 포함 합니다 .
  • -z 전체 파일을 줄 바꿈 대신 “null 바이트”가 포함된 단일 문자열로 전달합니다. 이를 통해 grep은 모든 것을 한 줄로 처리할 수 있습니다.
  • (?s) PCRE_DOTALL을 켜서 . 문자가 개행을 포함한 모든 문자와 일치하도록 합니다.
  • from 시작 경기.
  • .*n.*to은 (는) 최종 일치인  까지 모든 항목과 일치합니다.

일반적으로 이것은 스크립팅 목적으로 수행되지만 직접 입력하는 경우 기억해야 할 사항이 많습니다. 또한 -o 플래그를 사용하여 일치 항목만 인쇄하면 종료 널 바이트도 인쇄되므로 추가 문제가 발생할 수 있습니다.

대신 pcre2grep 사용(Perl 호환 grep)

Regular grep 는 작업에 가장 적합한 도구가 아니며 pcre2grep Perl 호환 정규식에 대한 지원을 즉시 포함하고 여러 줄 정규식과 매우 쉽게 일치할 수 있는 이라는 대안이 있습니다.

시스템에 설치되어 있을 수 있지만 그렇지 않은 경우 패키지 관리자에서 얻을 수 있습니다.

sudo apt install pcre2-utils

그런 다음 매개 변수와 함께 실행하기만 하면 -M 됩니다.

pcre2grep -M 'from(n|.)*to' file

이렇게 하려면 “개행 또는 임의의 문자”를 수동으로 일치시켜야 합니다 (n|.)* . 또는 (?s) 트릭을 사용하여 PCRE_DOTALL을 활성화하고 점 문자가 개행 문자와 일치하도록 할 수 있습니다.

pcre2grep -M '(?s)from.*to' file

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다