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

  FORUM HardWare.fr
  Programmation
  Shell/Batch

  sed et backslashes ( \ )

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

sed et backslashes ( \ )

n°1139255
theShockWa​ve
I work at a firm named Koslow
Posté le 04-07-2005 à 12:27:41  profilanswer
 

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
mood
Publicité
Posté le 04-07-2005 à 12:27:41  profilanswer
 

n°1139268
Elmoricq
Modérateur
Posté le 04-07-2005 à 12:38:55  profilanswer
 

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
n°1139289
theShockWa​ve
I work at a firm named Koslow
Posté le 04-07-2005 à 13:14:52  profilanswer
 

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]

n°1139290
Elmoricq
Modérateur
Posté le 04-07-2005 à 13:15:53  profilanswer
 

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

n°1139299
theShockWa​ve
I work at a firm named Koslow
Posté le 04-07-2005 à 13:28:51  profilanswer
 

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

n°1143129
theShockWa​ve
I work at a firm named Koslow
Posté le 07-07-2005 à 12:38:18  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Shell/Batch

  sed et backslashes ( \ )

 

Sujets relatifs
Plus de sujets relatifs à : sed et backslashes ( \ )


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)