Stampa linee tra (e incluso) due motivi


16

Voglio iniziare il grepping dalle linee che ha CKalla fine della linea e smettere di grepping quando la linea ha Dalla fine. Ci ho provato grep "$CK" "$D" file..txt, ma non ha funzionato.

Ingresso:

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

L'output desiderato:

gggggggggggg/CK  
JHGHHHHHHHH   
HJKHKKLKLLL   
JNBHBHJKJJLKKL  
JLKKKLLKJLKJ/D

Risposte:


21

Stai meglio usando o

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

O

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

Se insisti su , ecco un modo GNU grep

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

Qui

-P attiva perl-regexp

-zimposta il separatore di riga su NUL. Questo costringe grep a vedere l'intero file come un'unica riga

-o stampa solo la corrispondenza

(?s)attiva PCRE_DOTALL, quindi .trova qualsiasi carattere o newline

\N corrisponde a tutto tranne a newline

.*?trova. in modalità non grigia

(?<=..) è un'affermazione retrospettiva

(?=..) è un'affermazione lungimirante


perché non aggiungere barra? cosìawk '/\/CK/,/\/D/' input
— Rahul Patil,

@RahulPatil, questo perché l'OP ha dichiarato 'inizia il grepping dalle linee che hanno "CK" alla fine della linea e smette di grepping quando la linea ha "D"'
— iruvar

mi sembra che tu abbia una forte comprensione del regex .. Non ho capito quel livello, quindi potresti per favore spiegare quell'ultimo dei PCRE grep
— Rahul Patil

@RahulPatil, aggiunte alcune spiegazioni :-)
— iruvar

@RohitPatil, voglio eliminare la selezione corrispondente dal file. posso farlo?
— Rana Khan,

0

Se stai usando BSD grep(non supporta perl regex param -P), ecco la soluzione alternativa:

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

Funziona concatenando tutte le linee (sostituendo le nuove linee con il _carattere), controllando il modello a una linea e espandendo le linee al suo stato originale.

Se stai usando GNU grep, puoi ottenere una corrispondenza multilinea in grep, ma devi usare perl-regexp per grep( -P) come menzionato in un'altra risposta . Puoi comunque installare GNU grepsu macOS tramite brew install grepe usare ggrepinvece.


In alternativa è possibile utilizzare pcregrepquale supporta i pattern multilinea ( -M).


Puoi anche usare il excomando, ad esempio:

ex +"/aaa/;/cdn/p" -scq! file
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.