Come rimuovere più righe per occorrenza in un file?


10

Supponiamo di avere questo file di linea 857835, contenente elementi come questo:

a1
rubbish1
rubbish2
rubbish3
rubbish4
a1
rubbish5
rubbish6
rubbish7
rubbish8

E desidero rimuovere tutte le occorrenze della a1riga successiva ( rubbish1e rubbish5in questo esempio). Come lo faccio?

Ho provato grep 'a1' -v -A1inutilmente, e le mie sed skillz non sono davvero eccezionali:}

Il mio Google-fu non è stato in grado di aiutarmi questa volta, qualcuno per favore aiutatemi!

Risposte:


15

Provare:

sed -e '/^a1$/,+1d' "filename"

Ciò significa che da / ^ a1 $ / alla riga successiva, eliminare

^ E $ assicurano di abbinare l'intera linea, quindi un a1 nascosto non verrà abbinato.


6
Potresti volere ^e $in quella partita forzare la corrispondenza di intere linee.
Jander,

@Jander: certo, corretto
asoundmove

12

Di seguito funzionerà su non GNU sed(la ,+1sintassi dell'indirizzo è un'estensione GNU):

sed -e '/^a1$/,/^/d' my_file >my_filtered_file

"Iniziando da una riga che legge esattamente" a1 "e termina alla riga successiva per la quale esiste l'inizio della riga (ovvero la riga successiva), eliminare."

È molto meno estensibile della risposta di @ asoundmove, poiché l'eliminazione di un numero diverso di righe richiederebbe uno script completamente diverso.

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.