Avec sed:
sed '$!N;/remove/!P;D' infile
Cela tire la Nligne ext dans l'espace modèle (si ce n'est pas !sur la $ligne t) et vérifie si l'espace modèle correspond remove. Si ce n'est pas le cas (cela signifie qu'aucune des deux lignes de l'espace de motif ne contient la chaîne remove), elle Ps'imprime jusqu'au premier \ncaractère ewline (c'est-à-dire qu'elle imprime la première ligne). Ensuite, il se Dtermine jusqu'au premier \ncaractère ewline et redémarre le cycle. De cette façon, il n'y a jamais plus de deux lignes dans l'espace de motif.
Il est probablement plus facile de comprendre le N, P, le Dcycle si vous ajoutez lavant et après la Nregarder l'espace de travail :
sed 'l;$!N;l;/remove/!P;D' infile
donc, en utilisant uniquement les six dernières lignes de votre exemple:
8AC3
remove
8AE4
8AE5
8AE6
remove
la dernière commande sort:
8AC3 $
8AC3 \ n supprimer $
supprimer $
supprimer \ n 8AE4 $
8AE4 $
8AE4 \ n 8AE5 $
8AE4
8AE5 $
8AE5 \ n 8AE6 $
8AE5
8AE6 $
8AE6 \ n supprimer $
supprimer $
supprimer $
Voici une courte explication:
sortie cmd cmd
l 8AC3$ N # read in the next line
l 8AC3\n remove$ D # delete up to \n (pattern space matches so no P)
l remove$ N # read in the next line
l remove\n 8AE4$ D # delete up to \n (pattern space matches so no P)
l 8AE4$ N # read in the next line
l 8AE4\n 8AE5$ # pattern space doesn't match so print up to \n
P 8AE4 D # delete up to \n
l 8AE5$ N # read in the next line
l 8AE5\n 8AE6$ # pattern space doesn't match so print up to \n
P 8AE5 D # delete up to \n
l 8AE6$ N # read in the next line
l 8AE6\n remove$ D # delete up to \n (pattern space matches so no P)
l remove$ # last line so no N
l remove$ D # delete (pattern space matches so no P)