Cela pourrait fonctionner pour vous (GNU sed):
echo -e "a\nyyyy\nxxxx\nzzzz\nb" | sed 'N;/^xxxx/M{/^xxxx/d;$!N;d};P;D'
a
b
Cela permet de maintenir une fenêtre de deux lignes dans l'espace de travail et Si l'expression rationnelle requise est trouvée dans la première ou la deuxième ligne, lit la ligne suivante, puis supprime toutes les trois lignes. Les cas de bord sont si l'expression rationnelle est trouvée dans la première ou la dernière ligne lorsqu'il n'y a pas de ligne avant/après. Dans ces cas, seules deux lignes peuvent être supprimées. Par ailleurs, cette solution a peut-être mis au jour un bug possible dans GNU sed. Le drapeau M
d'une adresse permet aux métacaractères ^
et $
d'être utilisés comme marqueurs de longueur zéro dans une expression rationnelle pour le début et la fin de ligne dans les chaînes multilignes. L'adresse vide //
réutilise une adresse précédemment indiquée. Cette adresse devrait-elle comporter un drapeau multiligne? À l'heure actuelle, il semble inclure le drapeau même si on ne dit pas à savoir
sed 'N;/^xxxx/M{/^xxxx/d;$!N;d};P;D' file
produit un autre (correct) résultat à:
sed 'N;/^xxxx/M{//d;$!N;d};P;D' file
si xxxx
apparaît sur la deuxième ligne d'un fichier.
Une autre explication de la Commande 'x' qui "change" l'espace du motif avec le tampon de maintien: http://www.grymoire.com/Unix/Sed.html#uh-53 –
Je ne peux pas exécuter le script ci-dessus. il dit sed: FONCTION/^ motif/{n n x d} x 1d p $ {x p} ne peut pas être analysé pas sûr pourquoi? –