Comment echapper une chaine de caractères ? [script shell] - Codes et scripts - Linux et OS Alternatifs
Marsh Posté le 13-10-2005 à 14:18:51
perl -i -pe "s/TempDir=/root/.tools/Temp/TempDir=$TempDir/g" ~/.tools/tools.conf
non ?
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 $
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
Pour le 2eme problème, je vais regarder les "^" et les "$" ! merci
Si quelqu'un a une autre idée pour mon 1er problème, il est le bienvenu
Edit : 2eme problème résolu, merci arghbis
perl -i -pe 's/^Password=/Password='$MD5ADMINPASSWORD'/g' ~/.tools/remote.conf
Plus qu'un problème
Vous ne connaissez pas une commande d'une librairie genre textutils qui saurait faire de l'echappement de caractères ?
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
Marsh Posté le 13-10-2005 à 15:03:34
Albator : ça marche presque !
avec $TempDir=/mnt/share, je me retrouve avec :
TempDir=mntshare
Il ne manque que les "/"
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
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
Edit : faut virer le -i et j'avait oublié un \ , je vais voir ce que ça donne !
Marsh Posté le 13-10-2005 à 15:29:11
je ne connais pas tr, mais il aime pas avoir 3 paramètres
tr: too many arguments
Je vais aller voir l'aide
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.
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
Edit : j'ai trouvé un truc interessant :
escaped_TempDir=${TempDir/\//\\\/}
Ca transforme le 1er "/" en "\/", mais pas les suivants
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
Marsh Posté le 13-10-2005 à 16:23:23
Hum je n'arrive pas a stocker le résultar dans une variable
Code :
|
Ca me donne
Citation : > /scripts/toto.sh |
Comment faire ?
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 !
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.
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
Marsh Posté le 13-10-2005 à 17:52:55
_Sylver_ a écrit : Arf ... |
escaped_TempDir="$(echo $path_name|sed 's#/#\\/#g')"
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
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
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é... |
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
Donc avec des backquotes :
escaped_TempDir="`echo $path_name|sed 's#/#\\\/#g'`"
Et avec le / en séparateur (si je ne me trompe pas ) :
escaped_TempDir="`echo $path_name|sed 's/\//\\\\\//g'`"
ça devrait aussi fonctionner comme ça :
escaped_TempDir="`echo $path_name|sed 's/\\//\\\\\\//g'`"
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'`"
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 ) !
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:
Mais, le problème, c'est que si $TempDir n'est pas échappé, bha ça ne marche pas
Autre question en passant :
Si j'ai un fichier contenant ceci :
Password=
EcPassword=
Et que je ne veux patcher que "Password=" et pas l'autre, comment je peux m'y prendre ?
Merci d'avance !
Sylver