Grep 여러 줄 패턴 dfh djh sf my ice tea. 사이에 개행 문자가

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

as js skdfh dfh djh sf my
ice tea.

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

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



답변

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

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

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

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

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

pcregrep -M 'pattern1_\n_pattern2' filename


답변

아마도 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.


답변

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

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

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


답변

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

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

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


답변