2013-01-15 23 views
7

ho le linee in text.txt come di seguito:linee find tra due modelli utilizzando sed

blah blah.. 
blah abc blah.. 
blah abc blah 
blah blah.. 
blah blah.. 
blah blah.. 
blah efg blah blah 
blah blah.. 
blah abc blah 
blah abc blah 
blah abc blah 
blah abc blah 
blah abc blah 
blah blah.. 
blah efg blah blah 
blah blah.. 
blah blah.. 

Voglio uscita le linee tra ogni ultima occorrenza di "abc" prima "EFG" e "efg" , per l'esempio di cui sopra, voglio uscita:

blah abc blah 
blah blah.. 
blah blah.. 
blah blah.. 
blah efg blah blah 
blah abc blah 
blah blah.. 
blah efg blah blah 

so sed può selezionare intervalli utilizzando due modelli, come:

sed -n '/abc/,/efg/p' test.txt 

Howeve r l'uscita inizierà dalla prima occorrenza di "abc" anziché l'ultimo, l'uscita è la seguente:

blah abc blah.. 
blah abc blah 
blah blah.. 
blah blah.. 
blah blah.. 
blah efg blah blah 
blah abc blah 
blah abc blah 
blah abc blah 
blah abc blah 
blah abc blah 
blah blah.. 
blah efg blah blah 

Qualunque valorizzazione posso fare sulla linea di comando così l'uscita inizierà da last occorrenza di "abc"?

risposta

6

Questo potrebbe funzionare per voi (GNU SED):

sed -n '/\<abc\>/,/\<efg\>/{/\<abc\>/{h;d};H;/\<efg\>/{x;p}}' file 
+3

ho fatto qualche ricerca per capire questo, mi corregga se sbaglio: 1, sfuggito parentesi angolari sono opzionali, che indicano ciò che stiamo cercando perché sono parole. 2, il comando 'h' significa che salva lo spazio del modello nel buffer di mantenimento, 'H' significa accoda lo spazio del modello nel buffer di mantenimento, 'x' significa lo spazio del modello di scambio e il buffer di attesa. 3, l'intero comando selezionerà innanzitutto gli intervalli che iniziano con la prima riga contiene 'abc' e terminando con la seguente prima riga contiene 'efg', e quindi in ogni intervallo trova l'ultima riga contenente 'abc' e salva le righe seguenti fino alla riga contiene 'efg', e stampali – poiu2000

+0

grazie @potong per fornire una soluzione così buona – poiu2000

Problemi correlati