Le 20/12/07, Sylvain Sauvage<[EMAIL PROTECTED]> 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

