Evaluation des variables d'environnement avec sed

Evaluation des variables d'environnement avec sed - Codes et scripts - Linux et OS Alternatifs

Marsh Posté le 05-07-2004 à 17:08:33    

Salut à tous, j'ai un petit script à faire avec sed, je voudrais remplacer une chaine de caractère par une variable d'environnement dans un fichier qui contient que des lignes du style toto porte un tutu...
 ca donne qq chose comme ca :

Code :
  1. sed "s/\(toto\) \(.*tutu\)/\$USER \2/g" fichier


Et donc, comme vous l'avez compris si ca m'affiche que l'utilisateur porte un tutu c'est gagné ;) mais pour l'instant ca m'affiche :
$USER porte un tutu
 
Si vous savez comment faire pour évaluer cette variable... ca me sauverai la vie (peut-être pas, mais ca m'éviterait de longues heures de remplacement de texte manuel...)

Reply

Marsh Posté le 05-07-2004 à 17:08:33   

Reply

Marsh Posté le 05-07-2004 à 22:58:01    

ben enlève le "\" devant le $USER...

Reply

Marsh Posté le 06-07-2004 à 09:20:46    

Le probleme est que le "$" est un caractère spécial de sed qui veut dire "fin de ligne" donc ca ne va pas sans l' "\"... J'avais déjà essayé... Mais merci qd mm ;)

Reply

Marsh Posté le 06-07-2004 à 14:34:18    

Personne qui connait bien sed ici ?

Reply

Marsh Posté le 06-07-2004 à 15:26:42    

doncroco a écrit :

Le probleme est que le "$" est un caractère spécial de sed qui veut dire "fin de ligne" donc ca ne va pas sans l' "\"... J'avais déjà essayé... Mais merci qd mm ;)


 
Le shell (probablement le bash chez toi) va interprété la chaîne de caractère faiblement protégée ("s/\(toto\) \(.*tutu\)/\$USER \2/g" ) et va remplacer le $USER, ceci avant de passer l'argument à sed.
pour t'en convaincre, remplace sed par echo, tu verras.

Reply

Marsh Posté le 06-07-2004 à 16:29:39    

J'ai déjà essayé avec sed et c clair que ca marche pas...  En fait qd on utilise sed, le patron est une chaine de caractère donc non interprétée par le shell (qui est bien un bash)... et si j'essaye en mettant echo à la place de sed ca donne rien de mieux... et si je met des " à la place des ' sed me renvoie une erreur...

Reply

Marsh Posté le 06-07-2004 à 21:28:58    


isis:/tmp# cat > fichier
toto porte un tutu
tata porte un tutu
isis:/tmp# sed -e 's/\(toto\) \(.*tutu\)/$USER \2/g' fichier
$USER porte un tutu
tata porte un tutu
isis:/tmp# sed -e "s/\(toto\) \(.*tutu\)/$USER \2/g" fichier
root porte un tutu
tata porte un tutu
isis:/tmp# sed --version
GNU sed version 4.1
Copyright (C) 2003 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,
to the extent permitted by law.
isis:/tmp# bash --version
GNU bash, version 2.05b.0(1)-release (i386-pc-linux-gnu)
Copyright (C) 2002 Free Software Foundation, Inc.


 
Rien que de très normal quoi, les ' protegent l'interpretation des variables et pas les ".


Message édité par MaxMaverick le 06-07-2004 à 21:29:46
Reply

Marsh Posté le 06-07-2004 à 23:44:51    

oki merci bien, je v tester demain... il devait me manquer le -e ;)
Sympa :D

Reply

Marsh Posté le 07-07-2004 à 09:35:57    

Bon ca marche nickel avec $USER... mais pas avec $PWD, ni $HOME :cry: (en fait pour dire la vérité j'ai besoin de changer le chemin d'accès à plein de fichiers... mais je trouvais que toto qui porte des tutu c'était plus drole ;)  
 
Est-ce que ca pourrais venir du fait que j'ai la version 4.0.5 ... et pas la 4.1 ?


Message édité par doncroco le 07-07-2004 à 09:38:04
Reply

Marsh Posté le 07-07-2004 à 09:47:18    

Ok, c'est bon.... j'ai compris pourquoi je pensais que ca marcherai pas avec PWD et HOME... c'est à cause du "/" qu'ils rajoutent et donc que sed ne comprend plus.... il me reste plus qu'à trouver comment protéger le "/" sans dénaturer le "$" ! Je v finir par passer par le c pour faire tt ca ;) Merci bien à tous pour votre aide :D

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed