두 패턴 사이에 라인을 인쇄 시작하고 줄이 끝에 grepping을 멈추고

CK줄 끝에있는 줄에서 grepping을 시작하고 줄이 끝에 grepping을 멈추고 싶습니다 D. 시도 grep "$CK" "$D" file..txt했지만 작동하지 않았습니다.

입력:

kkkkkkkkkkk
jjjjjjjjjjjjjjjjjj
gggggggggggg/CK
JHGHHHHHHHH
HJKHKKLKLLL
JNBHBHJKJJLKKL
JLKKKLLKJLKJ/D
GGGGGGGGGGGGGG
GGGGGGGGGGGGGG

원하는 출력 :

gggggggggggg/CK
JHGHHHHHHHH
HJKHKKLKLLL
JNBHBHJKJJLKKL
JLKKKLLKJLKJ/D



답변

또는 사용하는 것이 좋습니다.

awk '/CK$/,/D$/' file.txt

또는

sed -n '/CK$/,/D$/p' file.txt

을 고집한다면 여기에 GNU grep 방식이 있습니다.

grep -oPz '(?s)(?<=\n)\N+CK\n.*?D(?=\n)' file.txt

여기

-P perl-regexp를 활성화합니다

-z줄 구분 기호를 NUL로 설정합니다. 그러면 grep이 전체 파일을 한 줄로 보게됩니다.

-o 일치하는 인쇄 만

(?s)PCRE_DOTALL을 활성화하므로 .모든 문자 또는 줄 바꿈을 찾습니다.

\N 개행을 제외한 모든 것과 일치

.*?찾습니다. 욕심없는 모드

(?<=..) 뒤에 숨어있는 주장이다

(?=..) 미리보기 주장입니다


답변

BSD를 사용하는 경우 grep(perl regex param을 지원하지 않음 -P), 해결 방법은 다음과 같습니다.

grep -o "aaa.*cdn" <(paste -sd_ file) | tr '_' '\n'

이것은 모든 줄을 연결하고 ( _문자 로 새 줄 바꾸기 ) 한 줄 패턴을 확인하고 줄을 원래 상태로 다시 확장하여 작동합니다.

GNU를 사용하는 경우에는 여러 줄을 grep일치시킬 수 grep있지만 다른 답변 에서 언급 한 것처럼 grep( -P)에 perl-regexp를 사용해야 합니다. 여전히 macOS에 GNU 를 설치 하고 대신 사용할 수 있습니다 .grepbrew install grepggrep


또는 pcregrep여러 줄 패턴 ( -M) 을 지원 하는 을 사용할 수 있습니다 .


다음 ex과 같은 명령 을 사용할 수도 있습니다 .

ex +"/aaa/;/cdn/p" -scq! file


답변