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
Bonjour,
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

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
Salut,

Essaie ça à tout hasard...

sed -r ':a;s/(_ *)\*/\1 /;ta;:z;s/\*( *_)/ \1/;tz' fichier

1
Merci !
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 ....
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 425
24 sept. 2012 à 23:20
Tu as les explications plus bas...
0
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
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
0
Merci quand meme !
0
Je me demande pourquoi le retour de :

echo "______********lalalalala" | sed 's/_\([\*]*\)\*\([\*]*\)/_\1_\2/g'

est
______*******_lalalalala

et pas :
______________lalalalala
0
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
Parce que pour obtenir ça :
______________lalalalala
la syntaxe est bien plus simple :

$ echo "______********lalalalala" | sed 's/\*/_/g'
______________lalalalala
0
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
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 :-)
0
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
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.

;-))
0
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
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 ^^
0