Imprima líneas entre (e incluyendo) dos patrones

16

Quiero comenzar grepping desde las líneas que tiene CKal final de la línea y dejar de grepping cuando la línea tieneD al final. Lo intenté grep "$CK" "$D" file..txt, pero no funcionó.

Entrada:

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

La salida deseada:

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

Respuestas:

21

Es mejor usar o

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

O

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

Si insiste en , aquí hay una forma grep de GNU

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

aquí

-P activa perl-regexp

-zestablece el separador de línea en NUL. Esto obliga a grep a ver todo el archivo como una sola línea

-o imprime solo a juego

(?s)activa PCRE_DOTALL, por lo que .encuentra cualquier carácter o nueva línea

\N coincide con cualquier cosa excepto nueva línea

.*?encuentra. en modo no codicioso

(?<=..) es una afirmación retrospectiva

(?=..) es una afirmación anticipada

iruvar
fuente
¿Por qué no agregar barra? asíawk '/\/CK/,/\/D/' input
Rahul Patil
@RahulPatil, eso se debe a que el OP declaró 'comenzar a agrupar desde las líneas que tiene "CK" al final de la línea y detener el agrupamiento cuando la línea tiene "D"'
iruvar
me parece que tienes una gran comprensión de la expresión regular ... No entendí ese nivel, así que, ¿podrías explicarme lo último de PCRE grep?
Rahul Patil
@RahulPatil, agregó alguna explicación :-)
iruvar
@RohitPatil, quiero eliminar la selección coincidente del archivo. ¿Puedo hacer eso?
Rana Khan
0

Si está utilizando BSD grep(no es compatible con perl regex param -P), aquí está la solución:

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

Esto funciona concatenando todas las líneas (reemplazando nuevas líneas con _caracteres), verificando el patrón de una línea y expandiendo las líneas a su estado original.

Si está utilizando GNU grep, puede lograr una coincidencia multilínea grep, pero necesita usar perl-regexp para grep( -P) como se menciona en otra respuesta . Todavía puede instalar GNU grepen macOS a través de brew install grepy usar ggrepen su lugar.


Alternativamente, puede usar el pcregrepque admite patrones de varias líneas ( -M).


También puede usar el excomando, por ejemplo:

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