Regexp : subst conditionelle à répétition
Résolu
raphael
-
zipe31 Messages postés 36402 Date d'inscription Statut Contributeur Dernière intervention -
zipe31 Messages postés 36402 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour,
voila mon probleme, j'ai une ligne du type :
Je voudrais remplacer les étoiles (*) par des espaces si la serie d'étoiles est précédée par un tiret bas OU suivie par tiret bas. Pour l'instant je me débrouille avec ca :
mais j'aimerais utiliser les expressions régulière de perl qui ne permet pas l'utilisation de "boucle"
Une idée ??
Merci d'avance
voila mon probleme, j'ai une ligne du type :
************___________________________*****_____________________________________________________gsa**riavkkaqlrssprpkkleklgvyssckaegackcngwksqn*****ppptpp______navnlqepcrscshtlg*dhvth*lenvseeemnrllgivldveylytci***hkeedadtkqvy*fslfkllrksilqmgkpmleaq*e*sppfekpsieq**gvnnfvqykfshlpskerqtimelakmflnqinywqletpsqrrqrvpnddaagykvnytrwlcycnvpqfcdslpryettqifgrtllrsvftvmrkqlleqarqekdklppekrtlilthfpkflsmleeevyshnspiwsqdf__________________________________________________________________le****************pnp******************************agekrkpseplpheenkrprvvgdipmdlinevmatitdpaai**pe*tsllsahsardeaarleerrgviefhvignslnqkpnkrilmwlvglqnvfshqlprmpkeyitrlvfdpkhktlslikdgrviggicfrmfp****sqgfteivfcavtsneqvkgygthlmnhlkeyhikheilnfl*tyadeyaigyfkkqgfskdikvpkskyvgyikdyegatlmgcelnpsipytefsviikkqkeiikklierkqaqirkvypglsc*fkdgvrqipiesipgi*retgwkpvgk**gkelkdpdqlystlktilqhv*k**shqnawpfmepvkkteapgyyqvirfpm***dlktmserlksryyttrklfmadmqriftncreynppeseyykcanllekffytkikeagliek
Je voudrais remplacer les étoiles (*) par des espaces si la serie d'étoiles est précédée par un tiret bas OU suivie par tiret bas. Pour l'instant je me débrouille avec ca :
sed ':boucle; s/ \*/ /g; t boucle' |sed ':boucle; s/\* / /g; t boucle'
mais j'aimerais utiliser les expressions régulière de perl qui ne permet pas l'utilisation de "boucle"
Une idée ??
Merci d'avance
3 réponses
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
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 :-)
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.
;-))
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 ....