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

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: