Input.txt:
8B0C
remove
8B0D
remove
8B0E
remove
8B0F
8B10
remove
8B14
remove
8B15
remove
8B16
remove
8B17
remove
8AC0
8AC1
remove
8AC2
remove
8AC3
remove
8AE4
8AE5
8AE6
remove
Sortie désirée:
8B0F
8AC0
8AE4
8AE5
Je veux imprimer une ligne si cette ligne ou la ligne suivante ne contient pas «supprimer». J'utilise Solaris 5.10, KSH.
text-processing
sed
awk
solaris
ayrton_senna
la source
la source
Réponses:
Avec
sed
: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 correspondremove
. Si ce n'est pas le cas (cela signifie qu'aucune des deux lignes de l'espace de motif ne contient la chaîneremove
), elleP
s'imprime jusqu'au premier\n
caractère ewline (c'est-à-dire qu'elle imprime la première ligne). Ensuite, il seD
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
, leD
cycle si vous ajoutezl
avant et après laN
regarder l'espace de travail :donc, en utilisant uniquement les six dernières lignes de votre exemple:
la dernière commande sort:
Voici une courte explication:
la source
la source
La méthode ci-dessus ne lit pas les enregistrements ligne par ligne , mais lit plutôt les enregistrements multilignes d'un séparateur d'enregistrements (RS) au suivant (ou à la fin du fichier) -
RS
étant la ligne "supprimer" elle-même (y compris son "\ n).Le
!RT
test est nécessaire lorsque la dernière ligne n'est pas uneRS
ligne.RT
, un gawk-ism , est le texte réel de l'enregistrement en coursRS
.gensub
est aussi un gawk-isme .Si vous devez rechercher une ligne de marqueur qui correspond à "supprimer" n'importe où dans la ligne, par rapport à une ligne qui équivaut à "supprimer", changez simplement le séparateur d'enregistrement en:
Production:
la source