[UNIX] Problème avec sed

Problème avec sed [UNIX] - Shell/Batch - Programmation

Marsh Posté le 13-10-2008 à 10:53:02    

Bonjour tout le monde,  
 
Je dois programmer un petit programme en korn shell et dans mon algorithme, je cherche à remplacer * par \* dans un fichier texte. Par exemple si j'ai toto*, je veux qu'il devienne toto\*.  
 
Pour cela, j'utilise la commande sed de la manière suivante : echo $variable | sed "s/\*/\\\*/g" Quand je teste cette commande en console (je précise que je travaille sous solaris), pas de problème, ça me retourne le résultat espéré. En revanche, quand je la mets dans un script, cette fois ci, la meme commande ne marche plus. Pourtant j'ai bien mis en premier ligne #! /bin/ksh (l'adresse du shell en gros) donc je comprends pas pourquoi ça marche quand  je la tape en ligne de commande et que ça marche plus à l'intérieur d'un script.
 
Je précise que le script est lancé par sh mais je pense pas que ça peut changer quoique ce soit (enfin je peux me planter :D)
 
Merci d'avance pour l'aide :p

Reply

Marsh Posté le 13-10-2008 à 10:53:02   

Reply

Marsh Posté le 13-10-2008 à 10:55:25    

Tu peux poster le script (ou en tout cas le bout de script concerné) ?

Reply

Marsh Posté le 13-10-2008 à 11:32:11    

Ouais bien sur
 

Code :
  1. cat tmp2 | sort -d | uniq > tmp
  2. #Variable contenant le résultat des droits sudo de l'utilisateur
  3. res_sudo=`sudo -l`
  4. #Boucle verifiant que toutes les lignes du fichier ficref sont bien présentes dans le fichier sudo
  5. cat tmp | while read i
  6. do
  7. #On regarde si la ligne est présent dans le richier sudo -l
  8. ligne=`echo "$res_sudo" | grep -i "$i"`
  9. a_rech=`echo "$i" | /usr/bin/sed "s/\*/\\\*/g"`
  10. echo "i = $i"
  11. echo "a_rech = $a_rech"
  12. ...


 
J'ai preferé spécifié le chemin mais théoriquement, ça change rien du tout.


Message édité par Dbbg le 13-10-2008 à 11:33:44
Reply

Marsh Posté le 13-10-2008 à 14:37:34    

petit up :p

Reply

Marsh Posté le 15-10-2008 à 11:43:29    

Ton sed marche bien, mais le problème c'est le dernier echo de ton script. C'est lui qui bouffe le backslash. Il est bien dans la chaine, mais c'est echo qui l'interprète. Il est là, mais ton script ne l'affiche pas.

Reply

Marsh Posté le 15-10-2008 à 16:18:22    

Bon finalement, j'ai contourné le problème en remplaçant * par etoile et je fais de même sur tout le fichier à rechercher. Assez bizarre ce problème mine de rien...

Reply

Marsh Posté le 15-10-2008 à 18:09:17    

?
 
Tu as lu mon message ?

Reply

Marsh Posté le 16-10-2008 à 09:29:24    

En fait, je l'avais pas lu avant de faire ma modification. Mais ce que je comprends pas en fait, c'est que si je tape cette même ligne " echo "$i" | /usr/bin/sed "s/\*/\\\*/g" " en remplaçant $i par sa valeur, la console m'affiche ce que je veux. Par contre, si je fais cette manip en passant par un script, ça marche plus.  
 
Mais là, j'avoue que j'ai pas d'idée pour savoir pourquoi ça fonctionne pas. J'ai pensé que la console et le script était pas sur le même shell mais je doute que ça soit le cas.  
 
Maintenant, si je comprends bien, tu me dis que c'est à cause de cet ligne : #  echo "a_rech = $a_rech" que mon sed est mal interprété (enfin peut être que je me trompe car je suis pas sur). Mais le truc, c'est que si je place ma variable a_rech dans un grep, ça ne l'interprète pas non plus. C'est ça qui est aussi bizarre.

Reply

Marsh Posté le 16-10-2008 à 13:05:37    

Non en fait je me suis gourré, c'est pas le echo qui bouffe le backslash, ce sont les backquotes. La bonne nouvelle c'est que c'est simple à contourner : il suffit d'utiliser $() au lieu des backquotes :

a_rech = $(echo "$i" | /usr/bin/sed "s/\*/\\\*/g" )

Reply

Marsh Posté le 17-10-2008 à 11:40:24    

Ok, je connaissais pas cette manière de contourner le problème. Bah je vais utiliser ça au lieu des backquotes, ça me permettra de faire moins d'erreurs bête au passage ;)

Reply

Sujets relatifs:

Leave a Replay

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