Sed supprime toutes les correspondances de motif de début de la ligne

11

J'ai la ligne suivante:

abababtestab

J'essaie de trouver une sedexpression pour supprimer toutes les occurrences de abdepuis le début de la ligne afin que la ligne transformée soit:

testab

Je pense que cela devrait être simple, mais je ne sais vraiment rien sed.

Ce que j'ai jusqu'à présent, c'est:

sed 's/^ab//'

Mais cela ne supprime que la première occurrence de ab.

Dan
la source

Réponses:

16
sed 's/^\(ab\)*//' <in >out

Vous devez le regrouper.

echo ababababtestab |
sed 's/^\(ab\)*//'

testab

Certains anciens seds ne peuvent pas gérer très bien, cependant. Bien que la duplication de sous-expression soit une fonctionnalité spécifiée par POSIX de BRE, certains sedne la prennent pas correctement en charge. Dans certains d'entre eux, cependant ...

echo abababtestab |
sed 's/^\(ab\)\1*//'

... pourrait fonctionner à la place.

mikeserv
la source
Exactement ce que je cherchais merci! (Je marquerai comme réponse une fois qu'il me le permettra)
Dan
Même la 7e édition sedde vers 1979 l'a soutenu. Il faudrait que ce soit une imitation inférieure pour ne pas gérer le regroupement.
Jonathan Leffler
@JonathanLeffler - voir la justification de l'expression régulière POSIX , qui est, en partie, sur laquelle j'ai basé la déclaration. C'est peut-être une hypothèse, mais il y a un paragraphe ici ... Les développeurs standard ont considéré le comportement historique commun, qui le supportait \n*, mais pas \n\{min,max\}. \(...\)*, ou \(...\)\{min,max\}, en tant que résultat non intentionnel d'une implémentation spécifique, et ils ont pris en charge les expressions de duplication et d'intervalle après les sous-expressions et les références arrières.
mikeserv
@JonathanLeffler: Cela ne fonctionne pas non plus avec la version sed des coffres à outils d'héritage.
cuonglm
@cuonglm - la \(ab\)\1*version fonctionne avec l'héritage par défaut sed, et la \(ab\)*version fonctionne avec l'héritage SuSv4 sed. Du moins, c'est le cas pour ma version. Certes, j'ai construit mon héritage contre Musl lib C, et donc je peux imaginer que cela pourrait le faire se comporter différemment. Mais généralement, lorsqu'une fonctionnalité spécifiée fonctionne dans un outil d'héritage SuSv4 d'héritage mais pas dans l'outil par défaut, c'est parce que le développeur l'a fait.
mikeserv
6

Un autre sed:

sed -e ':1' -e 's/^ab//;t1'

Avec chaque ligne d'entrée, nous mettons en place une étiquette :1, puis faisons une ssubstitution abau début de la ligne. Si l' substitution réussit, test la branche de commande à étiqueter 1, refaites le travail jusqu'à ce qu'aucun abmotif n'apparaisse au début de la ligne, nous avons terminé.

cuonglm
la source
Mes pensées exactement. Strictement, vous n'avez pas besoin de tester: s/^ab//; t1c'est suffisant
glenn jackman
@glennjackman: Ah, bien sûr. Mis à jour!
cuonglm