2008-08-29 37 views
3

Je veux échapper un nom de fichier DOS pour pouvoir l'utiliser avec sed. J'ai quelque chose de fichier batch DOS comme ceci:Le nom du fichier DOS s'échappe pour être utilisé avec les commandes * nix

set FILENAME=%~f1 

sed 's/Some Pattern/%FILENAME%/' inputfile 

(Note: %~f1 - étend %1 à un nom de chemin complet - C:\utils\MyFile.txt)

Je trouve que les anti-slash dans %FILENAME% sont juste Echapper à la lettre suivante .

Comment puis-je les doubler pour qu'ils s'échappent?

(j'ai installé Cygwin ne hésitez pas à utiliser d'autres commandes * nix)

Solution

La combinaison de suggestions de Jeremy et Alexandru Nedelcu, et en utilisant | pour le délimiteur dans la commande sed je

set FILENAME=%~f1 
cygpath "s|Some Pattern|%FILENAME%|" >sedcmd.tmp 
sed -f sedcmd.tmp inputfile 
del /q sedcmd.tmp 

Répondre

2

Cela fonctionne. C'est désordonné parce que dans les fichiers BAT, vous ne pouvez pas utiliser set var = `cmd` comme vous pouvez dans unix. Le fait que l'écho ne comprenne pas les guillemets est également compliqué, et pourrait causer 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 

[Modifié]: Je suis surpris que cela n'ait pas marché pour vous. Je l'ai juste testé, et ça a marché sur ma machine. J'utilise sed de http://sourceforge.net/projects/unxutils et en utilisant cmd.exe pour exécuter ces commandes dans un fichier bat.

2

Vous pouvez essayer comme solution de rechange (à partir de l'invite de commande) ...

> cygpath -m c:\some\path 
c:/some/path 

Comme vous pouvez le deviner, il convertit antislashs à barres obliques.

0

@Alexandru & Jeremy, Merci pour votre aide. Vous avez tous deux obtenir upvotes

@ Jeremy

Utilisation de votre méthode que je suis l'erreur suivante:

sed: -e expression #1, char 8: unterminated `s' command

Si vous pouvez modifier votre réponse pour le faire fonctionner je l'accepte. (coller ma solution ne compte pas)

Mise à jour: Ok, je l'ai essayé avec UnixUtils et cela 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)