sed et backslashes ( \ ) - Shell/Batch - Programmation
Marsh Posté le 04-07-2005 à 12:38:55
Déjà pour y voir plus clair, remplace les balises de sed par un autre caractère que '/'
Mets '#' par exemple, ou '|', ou j'sais pas quoi.
Ceci fonctionne :
echo "/cygdrive/d/fooModule/foo.c" | sed -e 's#/cygdrive/\([a-zA-Z]\)/\(.*\)#\1:\\\2#' -e 's#/#\\#g' |
Marsh Posté le 04-07-2005 à 13:14:52
bien vu, mais au final, j'ai trouvé l'origine de mon problème ... La chaine est interprétée une fois de plus dans le fichier => je dois doubler le nombre de \
Marsh Posté le 04-07-2005 à 13:15:53
Pour ça que j'ai mis des apostrophes, et pas des guillemets.
Marsh Posté le 07-07-2005 à 12:38:18
bon, j'ai un petit souci, à la suite de celui-ci, en fait ...
Je n'arrive pas à ouvrir scite avec des arguments potables ... enfin ... depuis la console directement, j'y parviens sans souci. Voilà le script que j'ai fait (il y a sans doute des façons bien plus élégantes de faire)
Code :
|
et donc, le problème vient des espaces ... Les chemins sans espace passent bien, SciTE les ouvre sans broncher, en revanche, impossible de lui faire prendre un chemin avec un espace sans qu'il ne prenne les caractères permettant de protéger l'espace. Je m'explique : j'avais tout d'abord tenté d'entourer les arguments par des quotes (simples ou doubles ) mais dans ce cas, il m'ouvrait par exemple C:\Program\" et Files\test\ (cas différent pour les simples quotes, mais pas satisfaisant pour autant). J'ai donc fait la fonction ci-dessus pour protéger les espaces avec des \, mais voilà ... quand je lui dis d'ouvrir C:\\Program\ Files\\test ... j'ai un fichier ouvert qui est : "C:\Program\ Files\test". Des idées ?
Edit : Minuscule mise à jour du script
Marsh Posté le 04-07-2005 à 12:27:41
Précision avant tout : je travaille sous cygwin
J'ai un petit souci avec sed et un comportement plutôt surprenant : je tente de remplacer les chemins cygwin en chemin windows (pour pouvoir appeler une appli windows depuis cygwin en lui passant en paramètre des chemins qu'elle puisse comprendre)
le but est donc de remplacer les /cygdrive/X/foo par X:\foo avec tous les '/' contenus dans foo remplacés par des '\'
Jusque là, rien de bien surprenant. Voilà un test que j'ai fait :
$ echo "/cygdrive/d/fooModule/foo.c" | sed -r "s/\/cygdrive\/([a-zA-Z])\/(.*)/\1:\/\2/" | sed -r "s/\//\\\\/g"
d:\fooModule\foo.c
donc ca semble pour le moins ok, cependant, voilà, dès que je mets cette commande dans un fichier de commandes bash, il me jette une erreur.
voilà le fichier
#!/usr/bin/bash
while [[ $1 ]] ; do
echo "entree : $1"
arg=`echo $1 | sed -r "s/\/cygdrive\/([a-zA-Z])\/(.*)/\1:\/\2/"`
echo "passe 1 : $arg"
arg=`echo $arg | sed -r "s/\//\\\\/g"`
echo "passe 2 : $arg"
shift
done
et le résultat de son appel :
slaurent@zsdev005 /cygdrive/d/.pm/bin
$ try "/cygdrive/d/fooModule/foo.c"
entree : /cygdrive/d/fooModule/foo.c
passe 1 : d:/fooModule/foo.c
sed: -e expression #1, char 8: unterminated `s' command
passe 2 :
ce n'est donc pas vraiment concluant ... J'ai pensé à un problème de jeu de caractères (j'utilise un éditeur hors de cygwin) ou a des problèmes de retours chariot, mais apparamment, le problème n'est pas là ... Des idées ?
Edit : "fixed ze balise"
Message édité par theShockWave le 04-07-2005 à 12:28:43