Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1148 connectés 

  FORUM HardWare.fr
  Linux et OS Alternatifs
  Codes et scripts

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°740318
_Sylver_
Posté le 13-10-2005 à 10:34:11  profilanswer
 

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
 

mood
Publicité
Posté le 13-10-2005 à 10:34:11  profilanswer
 

n°740406
HNO3
I can't use what I can't abuse
Posté le 13-10-2005 à 14:18:51  profilanswer
 

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

n°740408
arghbis
salops de dauphins
Posté le 13-10-2005 à 14:21:32  profilanswer
 

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 $

n°740416
_Sylver_
Posté le 13-10-2005 à 14:41:59  profilanswer
 

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
n°740421
[Albator]
MDK un jour, MDK toujours !
Posté le 13-10-2005 à 14:54:44  profilanswer
 

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  

n°740425
_Sylver_
Posté le 13-10-2005 à 15:03:34  profilanswer
 

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
n°740430
arghbis
salops de dauphins
Posté le 13-10-2005 à 15:11:19  profilanswer
 

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

n°740438
_Sylver_
Posté le 13-10-2005 à 15:17:49  profilanswer
 

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
n°740443
arghbis
salops de dauphins
Posté le 13-10-2005 à 15:24:10  profilanswer
 

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

n°740446
_Sylver_
Posté le 13-10-2005 à 15:29:11  profilanswer
 

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:

mood
Publicité
Posté le 13-10-2005 à 15:29:11  profilanswer
 

n°740448
[Albator]
MDK un jour, MDK toujours !
Posté le 13-10-2005 à 15:30:37  profilanswer
 

à 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.

n°740449
_Sylver_
Posté le 13-10-2005 à 15:32:41  profilanswer
 

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
n°740458
arghbis
salops de dauphins
Posté le 13-10-2005 à 16:01:55  profilanswer
 

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

n°740460
_Sylver_
Posté le 13-10-2005 à 16:12:23  profilanswer
 

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:

n°740462
_Sylver_
Posté le 13-10-2005 à 16:23:23  profilanswer
 

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:

n°740463
arghbis
salops de dauphins
Posté le 13-10-2005 à 16:33:52  profilanswer
 

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

n°740464
_Sylver_
Posté le 13-10-2005 à 16:40:27  profilanswer
 

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
n°740474
arghbis
salops de dauphins
Posté le 13-10-2005 à 17:11:07  profilanswer
 

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.

n°740475
arghbis
salops de dauphins
Posté le 13-10-2005 à 17:13:50  profilanswer
 
n°740478
_Sylver_
Posté le 13-10-2005 à 17:21:49  profilanswer
 

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

n°740491
Pillow
'cos the trees won't talk
Posté le 13-10-2005 à 17:52:55  profilanswer
 

_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')"
 

n°740578
_Sylver_
Posté le 13-10-2005 à 22:47:34  profilanswer
 

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

n°740583
arghbis
salops de dauphins
Posté le 13-10-2005 à 23:26:47  profilanswer
 

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:

n°740586
_Sylver_
Posté le 13-10-2005 à 23:34:17  profilanswer
 

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:

n°740593
Pillow
'cos the trees won't talk
Posté le 14-10-2005 à 00:52:45  profilanswer
 

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]

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Linux et OS Alternatifs
  Codes et scripts

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

 

Sujets relatifs
script shutdown et reboot sous gnome[RESOLU] script bash avec hylafax
script perlCharger script au démarrage
problème shell bash sur variables[Résolu] Caractere bizarre dans un script AWK
Script pour mis à jour de donnéesUtilisation de crontab pour planifier un script php
problème d'execution de scriptProblème de police de caractères ...
Plus de sujets relatifs à : [script shell] Comment echapper une chaine de caractères ?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR