[script shell] Comment echapper une chaine de caractères ?

Comment echapper une chaine de caractères ? [script shell] - Codes et scripts - Linux et OS Alternatifs

Marsh Posté le 13-10-2005 à 10:34:11    

Bonjour à tous,
Le contexte : je fourni une image système de remplacement pour un serveur Linux de type NAS (serveur de fichier). De ce fait j'ai installé plusieurs applications de type serveur et j'écris des petits scripts permettant a l'utilisateur d'activer ou non les serveurs présents (pour des soucis de consommation de RAM, 128Mo ça part vite :D) !
Je me retrouve a devoir écrire un script un peu plus "complexe" que les autres qui ne faisaient que créer les liens symboliques dans /etc/rc.d/rc*.d, car là il faut que je demande a l'utilisateur des chemins de stockage, et que j'aille "patcher" ça dans un fichier de conf... Jusque là ça va, sauf que pour patcher j'utilise une commande perl (perl -i -pe "s/chaine_a_remplacer/chaine_de_remplacement/g' nom_du_fichier) dans laquelle les chaines doivent être échapées (caractère '\' a mettre devant les caractères sensibles genre '/')
 
Pour l'instant la partie de mon script qui fait ça est comme ça:

Code :
  1. echo "Choose temp directory (should be in /mnt/...) :"
  2. read TempDir
  3. perl -i -pe 's/TempDir=\/root\/.tools\/Temp/TempDir='$TempDir'/g' ~/.tools/tools.conf


Mais, le problème, c'est que si $TempDir n'est pas échappé, bha ça ne marche pas :D
 
Autre question en passant :
Si j'ai un fichier contenant ceci :

Citation :

Password=
EcPassword=


Et que je ne veux patcher que "Password=" et pas l'autre, comment je peux m'y prendre ?
 
Merci d'avance !
 
Sylver
 

Reply

Marsh Posté le 13-10-2005 à 10:34:11   

Reply

Marsh Posté le 13-10-2005 à 14:18:51    

perl -i -pe "s/TempDir=/root/.tools/Temp/TempDir=$TempDir/g" ~/.tools/tools.conf
 
non ?

Reply

Marsh Posté le 13-10-2005 à 14:21:32    

faudrait déjà protéger tes / dans ton chemin pour qu'il ne les confonde pas avec les séparateurs de regexp.
 
pour ta deuxième question, c'est un pb de regexp, regardes du côté des caractères ^ et $

Reply

Marsh Posté le 13-10-2005 à 14:41:59    

Zut j'ai pas copié la bonne version du script !
Pour l'instant j'ai :
perl -i -pe 's/TempDir=\/root\/.tools\/Temp/TempDir='$TempDir'/g' ~/.tools/tools.conf
Si je ne met pas les ' autour de $TempDir, ça me patch en mettant TempDir=$TempDir, ça m'aide pas vraiment :D
 
Pour le 2eme problème, je vais regarder les "^" et les "$" ! merci :jap:
 
Si quelqu'un a une autre idée pour mon 1er problème, il est le bienvenu :D
 
Edit : 2eme problème résolu, merci arghbis :love:
perl -i -pe 's/^Password=/Password='$MD5ADMINPASSWORD'/g' ~/.tools/remote.conf
Plus qu'un problème :D
Vous ne connaissez pas une commande d'une librairie genre textutils qui saurait faire de l'echappement de caractères ?


Message édité par _Sylver_ le 13-10-2005 à 14:55:57
Reply

Marsh Posté le 13-10-2005 à 14:54:44    

Ca serait pas plus simple d'utiliser un caractère de séparation différent de / pour la regexp ? Je sais que c'est possible avec sed, mais avec perl aucune idée ...
 
Sinon ça, entourer $TempDir par un double quote, ça ne résoud pas ton pb ?
perl -i -pe 's/TempDir=\/root\/.tools\/Temp/TempDir='"$TempDir"'/g' ~/.tools/tools.conf  

Reply

Marsh Posté le 13-10-2005 à 15:03:34    

Albator : ça marche presque !
avec $TempDir=/mnt/share, je me retrouve avec :
TempDir=mntshare :D
Il ne manque que les "/"  :sweat:


Message édité par _Sylver_ le 13-10-2005 à 15:04:19
Reply

Marsh Posté le 13-10-2005 à 15:11:19    

fais une première substitution de / par \/ sur ta variable $TempDir
 
ensuite, tu peux l'utiliser

Reply

Marsh Posté le 13-10-2005 à 15:17:49    

Je peux faire ça dans des variables avec perl ?
genre :
perl -pe 's/\//\\\//g' TempDir
?
 
En tout cas ça fait de jolis motifs :D
 
Edit : faut virer le -i et j'avait oublié un \ :D, je vais voir ce que ça donne !


Message édité par _Sylver_ le 13-10-2005 à 15:26:25
Reply

Marsh Posté le 13-10-2005 à 15:24:10    

j'aurais plutôt fais un TempDir=`tr "/" "\/" $TempDir`

Reply

Marsh Posté le 13-10-2005 à 15:29:11    

je ne connais pas tr, mais il aime pas avoir 3 paramètres :D
tr: too many arguments
 
Je vais aller voir l'aide :jap:

Reply

Marsh Posté le 13-10-2005 à 15:29:11   

Reply

Marsh Posté le 13-10-2005 à 15:30:37    

à priori tr ne convient pas pour cette utilisation, car il remplace caractère par caractère, et non pas un caractère par plusieurs caractères.

Reply

Marsh Posté le 13-10-2005 à 15:32:41    

Zut :(
Avec perl, j'ai pas reussi mon coup non plus :(
 
Je ne suis quand même pas le premier a vouloir patcher un chemin d'accès rentré par l'utilisateur dans un fichier de config :pt1cable:
 
Edit : j'ai trouvé un truc interessant :
escaped_TempDir=${TempDir/\//\\\/}
Ca transforme le 1er "/" en "\/", mais pas les suivants :(


Message édité par _Sylver_ le 13-10-2005 à 16:03:22
Reply

Marsh Posté le 13-10-2005 à 16:01:55    

buffer=`echo $TempDir | sed "s/\//\\\//g" `  
 
??

Reply

Marsh Posté le 13-10-2005 à 16:12:23    

Je viens de voir ta proposition !
Moi je viens d'arriver a  
escaped_TempDir=`echo $TempDir | sed 's/\//\\\//g'` et ça a l'air de marcher !
Merci à tous :jap:

Reply

Marsh Posté le 13-10-2005 à 16:23:23    

Hum je n'arrive pas a stocker le résultar dans une variable :sweat:

Code :
  1. #!/bin/bash
  2. path_name=/mnt/share/temp
  3. echo "$path_name" | sed 's/\//\\\//g'
  4. escaped_TempDir=`echo "$path_name" | sed 's/\//\\\//g'`
  5. echo "repertoire echappe = $escaped_TempDir"
  6. exit 0


Ca me donne  

Citation :

> /scripts/toto.sh
\/mnt\/share\/temp
sed: -e expression #1, char 9: unknown option to `s'
repertoire echappe =  


Comment faire ? :cry:

Reply

Marsh Posté le 13-10-2005 à 16:33:52    

t'as pas protégé les / dans tes expressions

Reply

Marsh Posté le 13-10-2005 à 16:40:27    

Arf ...
Je les ai protégés, mais quand tu colles dans une citation ou du code, ca interprete les échappements j'ai l'impression !
Mon script est  
#!/bin/bash
 
path_name=/mnt/sare
echo "$path_name" | sed 's/\//\\\//g'
escaped_TempDir=`echo "$path_name"|sed 's/\//\\\//g'`
echo "repertoire echappe = $escaped_TempDir"
 
exit 0
 
Je ne comprend pas pourquoi l'assignation ne marche pas ! C'est un cauchemard ce truc ! :pt1cable:

Message cité 1 fois
Message édité par _Sylver_ le 13-10-2005 à 16:44:54
Reply

Marsh Posté le 13-10-2005 à 17:11:07    

si tu rajoutes un set -x en début de script tu verras pourquoi
 
ensuite, pourquoi il fait cette erreur en question, je comprends pas.

Reply

Marsh Posté le 13-10-2005 à 17:13:50    

Reply

Marsh Posté le 13-10-2005 à 17:21:49    

Je regarderai ça ce soir merci !
J'ai jeté un coup d'oeil rapide, mais j'ai rien vu :(

Reply

Marsh Posté le 13-10-2005 à 17:52:55    

_Sylver_ a écrit :

Arf ...
Je les ai protégés, mais quand tu colles dans une citation ou du code, ca interprete les échappements j'ai l'impression !
Mon script est  
#!/bin/bash
 
path_name=/mnt/sare
echo "$path_name" | sed 's/\//\\\//g'
escaped_TempDir=`echo "$path_name"|sed 's/\//\\\//g'`
echo "repertoire echappe = $escaped_TempDir"
 
exit 0
 
Je ne comprend pas pourquoi l'assignation ne marche pas ! C'est un cauchemard ce truc ! :pt1cable:

escaped_TempDir="$(echo $path_name|sed 's#/#\\/#g')"
 

Reply

Marsh Posté le 13-10-2005 à 22:47:34    

T'es un chef pillow ! Ca marche au poil !
Merci à tous !

Reply

Marsh Posté le 13-10-2005 à 23:26:47    

c'est ce qui était dit dans l'url que je t'ai donné...
 
mais bon, ça marche et c'est tant mieux... vive le bash :hello:

Reply

Marsh Posté le 13-10-2005 à 23:34:17    

J'avais pas eu le temps de lire le lien, je venais de rentrer chez moi quand j'ai vu le message de pillow !
Merci bien en tout cas :jap:

Reply

Marsh Posté le 14-10-2005 à 00:52:45    

arghbis a écrit :

c'est ce qui était dit dans l'url que je t'ai donné...
 
mais bon, ça marche et c'est tant mieux... vive le bash :hello:


Pas tout à fait : une partie de la solution est l'utilisation de $(commande) au lieu de `commande`. Les backslashes sont interprétés différemment entre les backquotes, ce qui oblige à en rajouter [:spamafote]  
 
Donc avec des backquotes :
escaped_TempDir="`echo $path_name|sed 's#/#\\\/#g'`"
 
 
 
 
Et avec le / en séparateur (si je ne me trompe pas [:petrus75] ) :  
escaped_TempDir="`echo $path_name|sed 's/\//\\\\\//g'`"  
[:dawa]
 
 
ça devrait aussi fonctionner comme ça :  
escaped_TempDir="`echo $path_name|sed 's/\\//\\\\\\//g'`"
[:dawa] [:dawa]
 
 
 
 
Et si tu veux mettre ça entre des balises code, fixed ou spoiler sur HFR, il faut doubler le nombre de backslashes :
escaped_TempDir="`echo $path_name|sed 's/\\\\//\\\\\\\\\\\\//g'`"
[:boidleau]

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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