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
Était-ce utile?

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)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top