Avec sed
:
sed '$!N;/remove/!P;D' infile
Cela tire la N
ligne 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 P
s'imprime jusqu'au premier \n
caractère ewline (c'est-à-dire qu'elle imprime la première ligne). Ensuite, il se D
termine jusqu'au premier \n
caractè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 D
cycle si vous ajoutez l
avant et après la N
regarder 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)