두 패턴 사이에 라인을 인쇄


16

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

답변:


21

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

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 개행을 제외한 모든 것과 일치

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

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

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


왜 슬래시를 추가하지 않았습니까? 이렇게awk '/\/CK/,/\/D/' input
Rahul Patil

@RahulPatil은 OP가 라인 끝에 "CK"가있는 라인에서 grepping을 시작하고 라인에 "D"가있을 때 grepping을 중지
했기 때문에

그것은 당신이 정규식에 대한 강한 이해를 가지고있는 것 같습니다. 나는 그 수준을 이해하지 못 했으므로 PCRE grep의 마지막을 설명해 주시겠습니까?
Rahul Patil

@RahulPatil, 설명 추가 :-)
iruvar

@RohitPatil, 파일에서 일치하는 선택을 삭제하고 싶습니다. 내가 할 수 있습니까?
라나 칸

0

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.