Imprimir linhas entre (e incluindo) dois padrões

16

Eu quero começar o grepping a partir das linhas que tem CKno final da linha e parar de grepping quando a linha tiver Dno final. Eu tentei grep "$CK" "$D" file..txt, mas não funcionou.

Entrada:

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

A saída desejada:

gggggggggggg/CK  
JHGHHHHHHHH   
HJKHKKLKLLL   
JNBHBHJKJJLKKL  
JLKKKLLKJLKJ/D
Rana Khan
fonte

Respostas:

21

Você está melhor usando ou

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

OU

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

Se você insiste em , aqui está uma maneira de grep do GNU

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

Aqui

-P ativa perl-regexp

-zdefine o separador de linhas para NUL. Isso força o grep a ver o arquivo inteiro como uma única linha

-o imprime apenas correspondência

(?s)ativa PCRE_DOTALL, .localizando qualquer caractere ou nova linha

\N corresponde a qualquer coisa, exceto nova linha

.*?encontra. no modo não remediado

(?<=..) é uma afirmação indireta

(?=..) é uma afirmação antecipada

iruvar
fonte
por que não adicionou barra? assimawk '/\/CK/,/\/D/' input
Rahul Patil
@RahulPatil, isso é porque o OP declarou 'start grepping das linhas que tem 'CK' no final da linha e parada grepping quando a linha tem 'D''
Iruvar
parece-me, você tem forte compreensão de regex .. Eu não entendi esse nível, para que você possa explicar essa última de PCRE grep
Rahul Patil
@RahulPatil, acrescentou alguma explicação :-)
Iruvar
@RohitPatil, quero excluir a seleção correspondente do arquivo. posso fazer isso?
Rana Khan #
0

Se você estiver usando BSD grep(não suporta perl regex param -P), aqui está a solução alternativa:

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

Isso funciona concatenando todas as linhas (substituindo novas linhas por _caracteres), verificando o padrão de uma linha e expandindo as linhas de volta ao seu estado original.

Se você estiver usando o GNU grep, poderá obter a correspondência de várias linhas grep, mas precisará usar o perl-regexp para grep( -P) como mencionado em outra resposta . Você ainda pode instalar o GNU grepno macOS via brew install grepe usá-lo ggrep.


Como alternativa, você pode usar o pcregrepque suporta padrões de várias linhas ( -M).


Você também pode usar o excomando, por exemplo:

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