Re: [SHELL] remplacer un caractère dans une sous-chaine
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
Reply to: