Si une ligne immédiatement après une correspondance doit être supprimée, votre sed
programme devra envisager des correspondances consécutives. En d'autres termes, si vous supprimez une ligne après une correspondance qui correspond également, alors vous devriez probablement supprimer également la ligne qui suit.
Il est simplement mis en œuvre - mais vous devez regarder un peu en arrière.
printf %s\\n 0 match 2 match match \
5 6 match match match \
10 11 12 match 14 15 |
sed -ne'x;/match/!{g;//!p;}'
0
6
11
12
15
Cela fonctionne en échangeant des espaces de maintien et de motif pour chaque ligne lue - de sorte que la dernière ligne puisse être comparée au courant à chaque fois. Ainsi, lors de la sed
lecture d'une ligne, il échange le contenu de ses tampons. La ligne précédente correspond alors au contenu de son tampon d'édition, tandis que la ligne actuelle est mise en attente.
Donc, sed
vérifie la correspondance sur la ligne précédente match
, et si elle !
n’est pas trouvée, les deux expressions de la {
fonction }
sont exécutées. sed
sera g
et l'espace de prise en réécrivant l'espace de travail - ce qui signifie que la ligne courante est alors dans les deux espaces de maintien et motif - et il le //
vérifier pour un match à son expression régulière plus récemment compilé - match
- et si elle ne fonctionne pas , match
il est p
imprimé.
Cela signifie qu'une ligne n'est imprimée que si ce n'est pas le cas et la ligne immédiatement précédente ne l'est pas . Il supprime également tout échange inutile de séquences d' es.match
match
match
Si vous voulez une version capable de supprimer un nombre arbitraire de lignes apparaissant après, match
il vous faudra un peu plus de travail:
printf %s\\n 1 2 3 4 match \
match match 8 \
9 10 11 12 13 \
14 match match \
17 18 19 20 21 |
sed -net -e'/match/{h;n;//h;//!H;G;s/\n/&/5;D;}' -ep
... remplacez le nombre 5 par le nombre de lignes (y compris la ligne correspondante) que vous souhaitez supprimer ...
1
2
3
4
12
13
14
21