“abc”및 “efg”가 순서대로있는 파일을 찾고 싶습니다.이 두 문자열은 해당 파일에서 다른 줄에 있습니다. 예 : 내용이 담긴 파일 :
blah blah..
blah blah..
blah abc blah
blah blah..
blah blah..
blah blah..
blah efg blah blah
blah blah..
blah blah..
일치해야합니다.
답변
이 작업에는 Grep이 충분하지 않습니다.
대부분의 최신 Linux 시스템에서 발견되는 pcregrep 은 다음과 같이 사용할 수 있습니다.
pcregrep -M 'abc.*(\n|.)*efg' test.txt
여기서 -M
, --multiline
패턴이 한 줄보다 더 일치시킬 수 있습니다
최신 pcre2grep 도 있습니다. 둘 다 PCRE 프로젝트에 의해 제공됩니다 .
pcre2grep는 포트 의 일부로 Mac 포트 를 통해 Mac OS X에서 사용할 수 있습니다 pcre2
.
% sudo port install pcre2
다음과 같이 Homebrew 를 통해 :
% brew install pcre
또는 pcre2
% brew install pcre2
pcre2grep는 Linux (Ubuntu 18.04+) 에서도 사용 가능 합니다
$ sudo apt install pcre2-utils # PCRE2
$ sudo apt install pcregrep # Older PCRE
답변
grep이 가능한지 확실하지 않지만 sed는 매우 쉽습니다.
sed -e '/abc/,/efg/!d' [file-with-content]
답변
이 답변에서 영감을 얻은 솔루션은 다음과 같습니다 .
-
‘abc’와 ‘efg’가 같은 줄에있을 수있는 경우 :
grep -zl 'abc.*efg' <your list of files>
-
‘abc’와 ‘efg’가 다른 행에 있어야하는 경우 :
grep -Pzl '(?s)abc.*\n.*efg' <your list of files>
매개 변수 :
-
-z
입력을 행 세트로 취급하십시오. 각 행은 개행 대신 0 바이트로 종료됩니다. 즉, grep은 입력을 하나의 큰 행으로 취급합니다. -
-l
출력이 정상적으로 인쇄 될 각 입력 파일의 인쇄 이름. -
(?s)
PCRE_DOTALL을 활성화하십시오. 즉, ‘.’ 모든 문자 또는 개행을 찾습니다.
답변
포스터 LJ가 위에서 언급했듯이 sed로 충분합니다.
! d 대신 p를 사용하여 간단히 인쇄 할 수 있습니다.
sed -n '/abc/,/efg/p' file
답변
pcregrep에 크게 의존했지만 최신 grep을 사용하면 많은 기능을 위해 pcregrep을 설치할 필요가 없습니다. 그냥 사용하십시오 grep -P
.
OP 질문의 예에서 다음 옵션이 잘 작동한다고 생각합니다. 두 번째는 질문을 이해하는 방법과 가장 잘 일치합니다.
grep -Pzo "abc(.|\n)*efg" /tmp/tes*
grep -Pzl "abc(.|\n)*efg" /tmp/tes*
텍스트를 / tmp / test1로 복사하고 ‘g’를 삭제하고 / tmp / test2로 저장했습니다. 다음은 첫 번째가 일치하는 문자열을 표시하고 두 번째는 파일 이름 만 표시 함을 보여주는 출력입니다 (일반적으로 -o는 일치를 표시하고 일반적인 -l은 파일 이름 만 표시). ‘z’는 여러 줄에 필요하며 ‘(. | \ n)’은 ‘newline’이외의 다른 것 또는 ‘newline’과 일치한다는 것을 의미합니다.
user@host:~$ grep -Pzo "abc(.|\n)*efg" /tmp/tes*
/tmp/test1:abc blah
blah blah..
blah blah..
blah blah..
blah efg
user@host:~$ grep -Pzl "abc(.|\n)*efg" /tmp/tes*
/tmp/test1
버전이 충분히 새 버전인지 확인하려면 실행 man grep
하고 이와 비슷한 것이 맨 위 근처에 나타나는지 확인하십시오.
-P, --perl-regexp
Interpret PATTERN as a Perl regular expression (PCRE, see
below). This is highly experimental and grep -P may warn of
unimplemented features.
그것은 GNU grep 2.10에서 온 것입니다.
답변
tr
개행을 다른 문자로 바꾸려면 먼저 사용하여 쉽게 수행 할 수 있습니다 .
tr '\n' '\a' | grep -o 'abc.*def' | tr '\a' '\n'
여기서는 \a
개행 문자 대신 알람 문자 (ASCII 7)를 사용하고 있습니다. 이것은 거의 텍스트에서 찾을 수 없으며로 grep
일치 시키 .
거나 구체적으로 일치 시킬 수 있습니다 \a
.
답변
awk one-liner :
awk '/abc/,/efg/' [file-with-content]
![](http://daplus.net/wp-content/uploads/2023/04/coupang_part-e1630022808943-2.png)