2008-08-29 32 views
3

我想轉義DOS文件名,所以我可以使用它與sed。我有一個DOS批處理文件是這樣的:DOS文件名轉義使用* nix命令

set FILENAME=%~f1 

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

(注:%~f1 - 擴展%1到一個完全合格的路徑名 - C:\utils\MyFile.txt

我發現,在%FILENAME%反斜線只是逃避的下一個字母。

我該如何將它們加倍以便逃脫?

(我已經安裝了cygwin可以隨意使用任何其他* nix命令)

解決方案

結合傑里米和亞歷山德魯·內德爾庫的建議,並使用|在sed命令分隔符我有

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

回答

2

這將工作。這很麻煩,因爲在BAT文件中,你不能像使用unix一樣使用set var =`cmd`。 回聲不理解引號的事實也很混亂,如果Some Pattern包含shell元字符,可能會導致麻煩。

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

[編輯]:我很驚訝,它不適合你。我只是測試它,它在我的機器上工作。我從http://sourceforge.net/projects/unxutils使用sed並使用cmd.exe在bat文件中運行這些命令。

2

你可以(從命令提示符)作爲替代嘗試...

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

正如您可以猜到,它轉換反斜槓反斜槓。

0

@Alexandru & Jeremy,謝謝你的幫助。你倆都會upvotes

@Jeremy

用你的方法,我得到了以下錯誤:

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

如果你可以編輯你的答案,使其工作我會接受它。 (粘貼我的解決方案不算)

更新:好吧,我試過用UnixUtils,它的工作。 (作爲參考,我下載的UnixUtils是2007年3月1日發佈的,使用GNU sed版本3.02,我的Cygwin安裝了GNU sed版本4.1.5)