Re: [SHELL] remplacer un caractère dans une sous-chaine
Le 20/12/07, Sylvain Sauvage<Sylvain.Sauvage@metanoesis.net> a écrit :
> zelos 414, jeudi 20 décembre 2007, 11:02:21 CET
> >
> > Bonjour la liste,
>
> 'jour,
>
> > Je me heurte depuis quelques temps à un souci de substitution
> > de caractère dans une sous-chaine.
> >
> > Voici la chaîne d'origine:
> >
> > type[TEST] date[Sun Dec 16 15:45:53 CET 2007]
> > description[permission denied] level[critical]
> >
> > Quelquefois, je la reçois sous cette forme (remarquez qu'un
> > espace s'est inséré dans "perm ission" et "cri tical") :
> >
> > type[TEST] date[Sun Dec 16 15:45:53 CET 2007] description[perm
> > ission denied] level[cri tical]
> >
> > J'aimerai donc supprimer tous les espaces ' ' contenus entre
> > crochets SAUF dans ceux précédés de 'date' ou 'creationDate'
>
> Je suppose que les espaces insérés ne sont pas toujours au
> même endroit (sinon ce serait trop simple).
>
> > Je pense que sed peut suffir mais je n'arrive pas à trouver.
> >
> > En effet:
> >
> > echo "description[perm ission denied] " | sed -e
> > 's/\[.*\ .*]/\[\.*_\.*\]/g'
> >
> > et
> >
> > tr ' ' '_'
> >
> > ne sont pas corrects.
> >
> > Auriez-vous une idée?
>
> La commande «s» prend une ou deux «adresses»:
> adr1,adr2 s/…/…/…
> Ces adresses indiquent à s le cadre dans lequel il doit
> opérer. Ce sont deux expressions régulières marquant la zone
> de texte (une seule adresse → toute la ligne, deux adresses
> → début et fin de zone).
>
> Donc, pour remplacer tous les espaces entre deux crochets :
> /\[/,/\]/s/ /_/g
>
> À noter que, puisqu'il s'agit de remplacer un seul caractère,
> la commande «y» suffit ;
> /\[/,/\]/y/ /_/
>
> Bon, ça remplace tous les espaces mais ça le fait aussi pour
> date et creationDate, il faut donc discriminer. Et c'est là que
> les Athéniens s'atteignirent, la négation est une plaie :
>
> /\([^Dd]...\|[dD]\([^a]..\|a\([^t].\|t[^e]\)\)\)\[/,/\]/y/ /_/
>
> en clair, on teste les quatre caractères avant le crochet :
> — soit ce n'est pas d (ou D) ;
> — soit c'est d (ou D) et,
> — pas suivi d'un a ;
> — suivi d'un a et,
> — pas suivi d'un t ;
> — suivi d'un t mais pas d'un e.
>
> (Merci tous les \ à mettre devant les () et les |…
> Encore heureux que «xxx|yyy» n'a pas besoin d'être écrit
> «(xxx)|(yyy)»…)
>
> Bon, là ça ne teste que [Dd]ate, tu pourras facilement
> généraliser.
>
> Ah, euh, il ne faut pas de [] emboîtés dans les []…
>
> --
> Sylvain Sauvage
>
>
Alors là... du grand art. Malheureusement, il se peut que certains []
soient emboîtés aussi dans de rares cas.
Quelle solution envisager pour un traitement générique ?
Zelos
Reply to: