[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

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: