Regexp : subst conditionelle à répétition

Résolu
raphael -  
zipe31 Messages postés 36402 Date d'inscription   Statut Contributeur Dernière intervention   -
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   Statut Contributeur Dernière intervention   6 431
 
Salut,

Essaie ça à tout hasard...

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

1
raphael
 
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   Statut Contributeur Dernière intervention   6 431
 
Tu as les explications plus bas...
0
mamiemando Messages postés 33774 Date d'inscription   Statut Modérateur Dernière intervention   7 882
 
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
raphael
 
Merci quand meme !
0
raphael
 
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   Statut Contributeur Dernière intervention   6 431
 
Parce que pour obtenir ça :
______________lalalalala
la syntaxe est bien plus simple :

$ echo "______********lalalalala" | sed 's/\*/_/g'
______________lalalalala
0
mamiemando Messages postés 33774 Date d'inscription   Statut Modérateur Dernière intervention   7 882
 
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   Statut Contributeur Dernière intervention   6 431
 
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 33774 Date d'inscription   Statut Modérateur Dernière intervention   7 882
 
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