DOS-Dateinamen-Escape für die Verwendung mit *nix-Befehlen
Frage
Ich möchte einen DOS-Dateinamen maskieren, damit ich ihn mit sed verwenden kann.Ich habe eine DOS-Batchdatei, etwa so:
set FILENAME=%~f1
sed 's/Some Pattern/%FILENAME%/' inputfile
(Notiz: %~f1
- erweitert sich %1
zu einem vollständig qualifizierten Pfadnamen - C:\utils\MyFile.txt
)
Ich habe festgestellt, dass die Backslashes in %FILENAME%
entkommen nur dem nächsten Buchstaben.
Wie kann ich sie verdoppeln, damit sie entkommen sind?
(Ich habe Cygwin installiert, also können Sie gerne auch andere *nix-Befehle verwenden)
Lösung
Kombinieren Sie die Vorschläge von Jeremy und Alexandru Nedelcu und verwenden | Für den Trennzeichen im SED -Befehl habe ich
set FILENAME=%~f1
cygpath "s|Some Pattern|%FILENAME%|" >sedcmd.tmp
sed -f sedcmd.tmp inputfile
del /q sedcmd.tmp
Lösung
Das wird funktionieren.Es ist chaotisch, weil Sie in BAT-Dateien nicht set var=`cmd` verwenden können, wie Sie es unter Unix können.Die Tatsache, dass Echo Anführungszeichen nicht versteht, ist ebenfalls problematisch und könnte zu Problemen führen, wenn Some Pattern
enthält Shell-Metazeichen.
set FILENAME=%~f1
echo s/Some Pattern/%FILENAME%/ | sed -e "s/\\/\\\\/g" >sedcmd.tmp
sed -f sedcmd.tmp inputfile
del /q sedcmd.tmp
[Bearbeitet]:Ich bin überrascht, dass es bei dir nicht funktioniert hat.Ich habe es gerade getestet und es hat auf meinem Computer funktioniert.Ich verwende sed von http://sourceforge.net/projects/unxutils und cmd.exe verwenden, um diese Befehle in einer Bat-Datei auszuführen.
Andere Tipps
Sie könnten es alternativ versuchen (über die Eingabeaufforderung) ...
> cygpath -m c:\some\path
c:/some/path
Wie Sie sich vorstellen können, werden Backslashes in Schrägstriche umgewandelt.
@Alexandru & Jeremy, Danke für eure Hilfe.Ihr bekommt beide Upvotes
@Jeremy
Mit Ihrer Methode habe ich die folgende Fehlermeldung erhalten:
sed:-e Ausdruck Nr. 1, Zeichen 8:nicht abgeschlossener „s“-Befehl
Wenn Sie Ihre Antwort so bearbeiten können, dass sie funktioniert, würde ich sie akzeptieren.(Das Einfügen meiner Lösung zählt nicht)
Aktualisieren: Ok, ich habe es mit UnixUtils versucht und es hat funktioniert.(Zur Referenz: Die UnixUtils, die ich heruntergeladen habe, waren vom 1. März 2007 und verwenden GNU sed Version 3.02, meine Cygwin-Installation hat GNU sed Version 4.1.5)