Grep 여러 줄 패턴


13

여러 줄로 된 문구를 어떻게 검색합니까? 예를 들어 "my ice tea"라는 문구를 사용하면 텍스트 파일로 감쌀 수 있습니다.

as js skdfh dfh djh sf my
ice tea.

사이에 개행 문자가 있으므로 grep이 일치하지 않습니다. 그것들과 어떻게 일치합니까? 다른 여러 줄 패턴은pattern1_\n_pattern2

ATM을 수행하는 가장 쉬운 방법은 -A2 -B2 플래그로 얼음을 넣은 다음 차를 위해 다시 출력하는 것입니다. 그러나 이것은 매우 지루합니다. 그래서 나는 당신이 이것을 어떻게 해결할 수 있을지에 대해 조사되었습니다.


답변:


16

"Perl 호환 정규 표현식"을 수행 pcregrep하는 pcre 라이브러리를 사용하여 grep을 설치할 수 있습니다 (대부분의 배포 저장소에서 사용 가능) . 맨 페이지-M 에서 여러 줄 검색을 수행 할 수 있는 명령 줄 옵션 이 있습니다 .

"한 일치 항목에 대한 출력은 둘 이상의 행으로 구성 될 수 있습니다."

그래서 당신은 할 수 있습니다

pcregrep -M 'my\s+ice\s+tea' filename

\s일치 공백입니다 \n\r일반 공백 문자뿐만 아니라, 여러 모드입니다. 줄 바꿈 문자를 직접 일치시킬 수도 있으므로

pcregrep -M 'pattern1_\n_pattern2' filename

+1 좋아요 들어 본 적이 없지만 시도해 보니 매력처럼 작동합니다!
DaveParillo

하지 않습니다 grep -EPCRE 패턴을합니까?
데니스

3
@Daenyth 그렙 -E 대부분은 당신이 사용할 수 있다는 것을 의미 ?, +, {, |, (, 및 )을하지 않고도 일반적인 정규식 의미로 \ 는 표준 GREP을 사용하는 경우처럼, 앞에. 따라서 grep 'hello\s\+world' file와 같습니다 grep -E 'hello\s+world' file. PCRE를 수행하지 않습니다. 이 grep -P... 펄 정규 표현식하지만 실험입니다 (맨 페이지에 따라) 그리고 나는 그것이 pcregrep에서 조금 다른 생각
해미 다우 너

1
예, 말할 -P때 생각하고 -E있었지만 그것이 다르다는 것을 알지 못했습니다.
데니스

3

아마도 vim:vimgrep명령을 사용하여 검색 할 것입니다 . 이것은 모호한 방식으로 작동 grep하지만 vim RE 및 경로를 지원합니다.

기본적으로 :vimgrep 'pattern1\npattern2' path/**재귀 검색 과 같은 것을 실행 한 다음 입력 :copen하여 일치하는 목록이 포함 된 더 작은 창을 표시하십시오.

vimRE는 PCRE가 할 수있는 대부분의 작업을 수행 할 수 있지만 Perl 정규 표현식 계보와 별도로 진화하여 대부분의 고급 기능이 다르게 작동합니다. 기본 기능은 기본 RE의 기능과 비슷하지만 PCRE가 제공하지 않는 멋진 추가 기능이 있습니다.

:vimgrep데이터를 뱉어 낼 수 있는지 확실 grep하지 않습니다. 내 탐색에만 사용하려고했습니다 vim.

:help vimgrep내에서 vim더 많은 정보를 원하시면, RE에 :help pattern.txt대한 정보 vim; 경로에 대한 자세한 내용은을 참조하십시오 :help wildcards.


다른 플랫폼에서 다르게 동작하므로 완전히 이식 가능하지는 않습니다.
Daenyth

1
@Daenyth : 다른의 영향을 .vimrc받는가? grep운영 체제 보다 이식성이 vim뛰어나야합니다. "POSIX 풍미"가 없으며 Windows에서도 거의 동일하게 작동합니다. .................................................. ........................... 예를 들어 RE에서 적절한 양의 "마법"이 사용되도록 한정자를 추가 할 수 있습니다. 내가 알기로는 그 옵션을 그냥 내버려 두는 엄격한 기록되지 않은 규칙이 있습니다.
intuited

나는 그것을 직접 사용하지는 않았지만 Windows에서 다른 백엔드를 사용합니다 ( find.exe대신 grep). 지난 몇 주 동안 그 문제에 관한 또 다른 질문이있었습니다.
데니스

1
@Daenyth : 당신이 생각하고 :vimgrep:grep? From :help grep: "내부 grep의 장점 [즉 :vimgrep]은 모든 시스템에서 작동하며 강력한 Vim 검색 패턴을 사용한다는 것입니다."
intuited

1
아, 그렇습니다. 나는 혼란스러워했다.
데니스

2

Grep은 한 번에 한 줄에서만 작동하지만 awk를 사용하여 다양한 패턴과 일치하는 줄을 인쇄 할 수 있습니다.

cat file | awk '/foo/,/bar/'

두 패턴 사이의 줄 바꿈뿐만 아니라 아무것도 일치합니다.


0

유닉스를 최대한 활용하려면 파이프를 사용해야합니다. grep파이프를 사용하여 일반 에서이 작업을 수행 할 수 있습니다 (티 필요 없음).

$ grep -A1 "pattern1" file.txt |  grep "pattern2"

지루하다고 생각하지 않을 것입니다.


pattern1과 pattern2 사이에 pattern3이 존재할 수 있으므로 오류가 발생하기 쉽다고 생각합니다. 따라서 각 적중을 수동으로 제어해야합니다.
math
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.