Comment supprimer plusieurs lignes par occurrence dans un fichier?

10

Disons que j'ai ce fichier de ligne 857835, contenant des trucs comme celui-ci:

a1
rubbish1
rubbish2
rubbish3
rubbish4
a1
rubbish5
rubbish6
rubbish7
rubbish8

Et je souhaite supprimer toutes les occurrences de a1et la ligne suivante ( rubbish1et rubbish5dans cet exemple). Comment fait-on ça?

J'ai essayé grep 'a1' -v -A1en vain et mes compétences en sed ne sont pas vraiment géniales:}

Mon Google-fu n'a pas pu m'aider cette fois, quelqu'un s'il vous plaît aidez-moi!

rayfoo
la source

Réponses:

15

Essayer:

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

Cela signifie de / ^ a1 $ / à la ligne suivante, supprimez

Les ^ et $ vous assurent de faire correspondre la ligne entière, donc un a1 caché ne sera pas mis en correspondance.

asoundmove
la source
6
Vous pourriez vouloir ^et $dans cette correspondance, forcer la correspondance de lignes entières.
Jander
@Jander: Bien sûr, corrigé
asoundmove
12

Ce qui suit fonctionnera sur non-GNU sed(la ,+1syntaxe d'adresse est une extension GNU):

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

"En commençant à une ligne qui lit exactement 'a1' et en se terminant à la ligne suivante pour laquelle le début de la ligne existe (c'est-à-dire la ligne suivante), supprimez."

C'est beaucoup moins extensible que la réponse de @ asoundmove, car la suppression d'un nombre différent de lignes nécessiterait un script entièrement différent.

Jander
la source