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.