Nom de fichier DOS s'échappant pour être utilisé avec les commandes * nix
Question
Je souhaite échapper à un nom de fichier DOS pour pouvoir l'utiliser avec sed.J'ai un fichier batch DOS ressemblant à ceci :
set FILENAME=%~f1
sed 's/Some Pattern/%FILENAME%/' inputfile
(Note: %~f1
- se développe %1
vers un nom de chemin complet - C:\utils\MyFile.txt
)
J'ai trouvé que les barres obliques inverses dans %FILENAME%
échappent juste à la prochaine lettre.
Comment puis-je les doubler pour qu'ils s'échappent ?
(J'ai installé Cygwin, alors n'hésitez pas à utiliser d'autres commandes * nix)
Solution
Combiner les suggestions de Jeremy et Alexandru Nedelcu et en utilisant | Pour le délimiteur dans la commande SED, j'ai
set FILENAME=%~f1
cygpath "s|Some Pattern|%FILENAME%|" >sedcmd.tmp
sed -f sedcmd.tmp inputfile
del /q sedcmd.tmp
La solution
Cela fonctionnera.C'est compliqué car dans les fichiers BAT, vous ne pouvez pas utiliser set var=`cmd` comme vous le pouvez sous Unix.Le fait que echo ne comprenne pas les guillemets est également compliqué et pourrait entraîner des problèmes si Some Pattern
contient des méta-caractères shell.
set FILENAME=%~f1
echo s/Some Pattern/%FILENAME%/ | sed -e "s/\\/\\\\/g" >sedcmd.tmp
sed -f sedcmd.tmp inputfile
del /q sedcmd.tmp
[Édité]:Je suis surpris que cela n'ait pas fonctionné pour vous.Je viens de le tester et cela a fonctionné sur ma machine.J'utilise sed depuis http://sourceforge.net/projects/unxutils et en utilisant cmd.exe pour exécuter ces commandes dans un fichier bat.
Autres conseils
Vous pouvez essayer comme alternative (à partir de l'invite de commande)...
> cygpath -m c:\some\path
c:/some/path
Comme vous pouvez le deviner, il convertit les barres obliques inverses en barres obliques.
@Alexandru & Jeremy, Merci pour votre aide.Vous obtenez tous les deux des votes positifs
@Jérémie
En utilisant votre méthode, j'ai eu l'erreur suivante :
sed :-e expression n°1, caractère 8 :commande `s' non terminée
Si vous pouvez modifier votre réponse pour la faire fonctionner, je l'accepterais.(coller ma solution ne compte pas)
Mise à jour: Ok, je l'ai essayé avec UnixUtils et ça a fonctionné.(Pour référence, le UnixUtils que j'ai téléchargé était daté du 1er mars 2007 et utilise GNU sed version 3.02, mon installation Cygwin a GNU sed version 4.1.5)