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

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


¿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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.