파일에서 멀티 린 패턴을 검색하려면 어떻게해야합니까?
-
02-07-2019 - |
문제
특정 문자열 패턴이 포함 된 모든 파일을 찾아야했습니다. 떠오르는 첫 번째 솔루션은 사용하는 것입니다 찾기 파이프 Xargs Grep:
find . -iname '*.py' | xargs grep -e 'YOUR_PATTERN'
그러나 한 줄 이상에 걸쳐있는 패턴을 찾아야한다면 바닐라 Grep이 멀티 린 패턴을 찾을 수 없기 때문에 갇혀 있습니다.
해결책
그래서 나는 발견했다 PCREGREP 그것은 Perl 호환 정규식 GREP.
예를 들어, ''파일을 찾아야합니다._이름'변수는 즉석이 뒤 따릅니다.'_설명'변수 :
find . -iname '*.py' | xargs pcregrep -M '_name.*\n.*_description'
팁 : 패턴에 라인 브레이크 문자를 포함시켜야합니다. 플랫폼에 따라 ' n', r ',' r n ', ...
다른 팁
당신은 왜 가지 않습니까? 어색한:
awk '/Start pattern/,/End pattern/' filename
다음은 사용하는 예입니다 암소 비슷한 일종의 영양 grep
:
grep -Pzo '_name.*\n.*_description'
-z
/--null-data
입력 및 출력 데이터를 라인 시퀀스로 처리하십시오.
또한보십시오 여기
grep -P
또한 libpcre를 사용하지만 IS 많이 더 널리 설치되었습니다. 완전한 것을 찾으려면 title
HTML 문서의 섹션은 여러 줄에 걸쳐 있더라도 다음을 사용할 수 있습니다.
grep -P '(?s)<title>.*</title>' example.html
부터 PCRE 프로젝트 Perl 표준을 구현하고 참조를 위해 Perl 설명서를 사용하십시오.
다음은 더 유용한 예입니다.
pcregrep -Mi "<title>(.*\n){0,5}</title>" afile.html
최대 5 줄까지하더라도 HTML 파일의 제목 태그를 검색합니다.
다음은 무제한 라인의 예입니다.
pcregrep -Mi "(?s)<title>.*</title>" example.html
이 답변은 유용 할 수 있습니다.
멀티 라인 검색을위한 Regex (GREP)가 필요합니다
재귀 적으로 찾으려면 플래그 -r (재귀) 및 -include (글로벌 패턴)를 사용할 수 있습니다. 보다:
perl -ne 'print if (/begin pattern/../end pattern/)' filename
사용 ex
/vi
편집자와 Globstar 옵션 (구문과 비슷합니다 awk
그리고 sed
):
ex +"/string1/,/string3/p" -R -scq! file.txt
어디 aaa
당신의 출발점입니다 bbb
당신의 결말 텍스트입니다.
재귀 적으로 검색하려면 시도해보십시오.
ex +"/aaa/,/bbb/p" -scq! **/*.py
참고 : 활성화 **
구문, 실행 shopt -s globstar
(bash 4 또는 zsh).
@marcin : awk 예제 비-그 리디 :
awk '{if ($0 ~ /Start pattern/) {triggered=1;}if (triggered) {print; if ($0 ~ /End pattern/) { exit;}}}' filename