Regexp : subst conditionelle à répétition
Résolu/Fermé
raphael
-
21 sept. 2012 à 20:18
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 - 28 sept. 2012 à 22:50
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 - 28 sept. 2012 à 22:50
3 réponses
zipe31
Messages postés
36402
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
6 425
21 sept. 2012 à 23:02
21 sept. 2012 à 23:02
Salut,
Essaie ça à tout hasard...
Essaie ça à tout hasard...
sed -r ':a;s/(_ *)\*/\1 /;ta;:z;s/\*( *_)/ \1/;tz' fichier
mamiemando
Messages postés
33654
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
4 mai 2025
7 847
21 sept. 2012 à 20:43
21 sept. 2012 à 20:43
Je ne pense pas que ce soit possible avec une expression régulière car cette substitution repose sur une mémoire (on doit mémoriser le nombre d'étoiles ou bien mémoriser qu'on vient de lire un _).
Le plus simple reste quand même de lire ta chaîne caractère par caractère et de mémoriser le début et la fin de la dernière séquence d'étoile.
Bonne chance
Le plus simple reste quand même de lire ta chaîne caractère par caractère et de mémoriser le début et la fin de la dernière séquence d'étoile.
Bonne chance
zipe31
Messages postés
36402
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
6 425
28 sept. 2012 à 22:50
28 sept. 2012 à 22:50
Parce que pour obtenir ça :
______________lalalalala
la syntaxe est bien plus simple :
______________lalalalala
la syntaxe est bien plus simple :
$ echo "______********lalalalala" | sed 's/\*/_/g' ______________lalalalala
mamiemando
Messages postés
33654
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
4 mai 2025
7 847
23 sept. 2012 à 22:32
23 sept. 2012 à 22:32
Respect complet zipe31, je m'incline bien bas.
J'avoue que je n'ai rien compris à la syntaxe que tu proposes (qui est une syntaxe sed mais pas une expression rationnelle au sens strict), mais en tout cas elle a le mérite de marcher :-)
J'avoue que je n'ai rien compris à la syntaxe que tu proposes (qui est une syntaxe sed mais pas une expression rationnelle au sens strict), mais en tout cas elle a le mérite de marcher :-)
zipe31
Messages postés
36402
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
6 425
Modifié par zipe31 le 24/09/2012 à 00:04
Modifié par zipe31 le 24/09/2012 à 00:04
Salut mamie,
Rien de très compliqué là dedans.
-r
Option pour utiliser les expressions régulières étendues (ERE)
:a
On pose une étiquette pour pouvoir boucler
s/(_ *)\*/\1 /
(_ *)
Les parenthèses c'est pour les références arrières.
On cherche donc un underscore suivi d'un espace, de plusieurs ou d'aucun (qu'on mémorise dans une référence arrière), suivi d'un astérisque. Si on le trouve on le remplace par le contenu de la référence arrière suivi d'un espace.
ta
Si un substitution a eu lieu (commande "t"), on se branche à l'étiquette "a" et on boucle autant de fois que nécessaire.
:z;s/\*( *_)/ \1/;tz'
Là c'est la même chose, à la différence que l'underscore doit se trouver après l'astérisque.
;-))
Rien de très compliqué là dedans.
-r
Option pour utiliser les expressions régulières étendues (ERE)
:a
On pose une étiquette pour pouvoir boucler
s/(_ *)\*/\1 /
(_ *)
Les parenthèses c'est pour les références arrières.
On cherche donc un underscore suivi d'un espace, de plusieurs ou d'aucun (qu'on mémorise dans une référence arrière), suivi d'un astérisque. Si on le trouve on le remplace par le contenu de la référence arrière suivi d'un espace.
ta
Si un substitution a eu lieu (commande "t"), on se branche à l'étiquette "a" et on boucle autant de fois que nécessaire.
:z;s/\*( *_)/ \1/;tz'
Là c'est la même chose, à la différence que l'underscore doit se trouver après l'astérisque.
;-))
mamiemando
Messages postés
33654
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
4 mai 2025
7 847
24 sept. 2012 à 00:59
24 sept. 2012 à 00:59
Merci pour cette explication très claire, je ne soupçonnais même pas que sed savait faire ça :-) Je n'avais même jamais entendu parler d'ERE comme quoi on en apprend tous les jours ^^
24 sept. 2012 à 23:17
Je vais essayer de décoder ca, c'est un peu dur a lire mais ca marche !!
Par contre ce que j'aimerais c'est l'utiliser en perl, et la ca ne marche pas ....
24 sept. 2012 à 23:20