sed et backslashes ( \ )

sed et backslashes ( \ ) - Shell/Batch - Programmation

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 ?  :heink:
 
Edit : "fixed ze balise"


Message édité par theShockWave le 04-07-2005 à 12:28:43
Reply

Marsh Posté le 04-07-2005 à 12:27:41   

Reply

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'


Message édité par Elmoricq le 04-07-2005 à 13:02:27
Reply

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 \ [:petrus75]

Reply

Marsh Posté le 04-07-2005 à 13:15:53    

Pour ça que j'ai mis des apostrophes, et pas des guillemets. ;)

Reply

Marsh Posté le 04-07-2005 à 13:28:51    

ôôôh, je n'avais pas vu la subtilité [:petrus75]
 
merci du détail

Reply

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 :
  1. #!/usr/bin/bash
  2. editor=$WRAPPEDEDITOR
  3. tmpArg=""
  4. protectSpaces()
  5. {
  6. tmpArg2=""
  7. cpt=0
  8. for i in $tmpArg; do
  9.  if [ $cpt -ne 0 ]; then
  10.   # this doesn't seem to function very well
  11.   tmpArg2=$tmpArg2'\ '
  12.  fi
  13.  tmpArg2=${tmpArg2}${i}
  14.  cpt=$(($cpt+1))
  15. done
  16. tmpArg=$tmpArg2
  17. }
  18. arglist=""
  19. while [[ $1 ]] ; do
  20.   arg=`echo $1 | sed -e "s#/cygdrive/\\([a-zA-Z]\\)/\\(.*\\)#\\1:\\\\\\\\\\\\\\\\\\2#" -e "s#^/#c:\\\\\\\\\\\\\\\\cygwin\\\\\\\\\\\\\\\\#" -e "s/\\\\//\\\\\\\\\\\\\\\\/g"`
  21.   tmpArg=$arg
  22.   protectSpaces
  23.   arglist=$arglist" "$tmpArg
  24.   echo $tmpArg
  25.   shift
  26. done
  27. echo $arglist
  28. #result=`"$editor" $arglist`
  29. command=${editor}${arglist}
  30. echo "commande = $command"
  31. $command


 
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  :sweat: ) 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


Message édité par theShockWave le 07-07-2005 à 14:37:21
Reply

Sujets relatifs:

Leave a Replay

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