Scripting 用于*nix命令的DOS文件名转义

Scripting 用于*nix命令的DOS文件名转义,scripting,shell,dos,Scripting,Shell,Dos,我想转义一个DOS文件名,这样我就可以将它与sed一起使用。我有一个DOS批处理文件,如下所示: set FILENAME=%~f1 sed 's/Some Pattern/%FILENAME%/' inputfile (注意:%~f1-将%1扩展为完全限定的路径名-C:\utils\MyFile.txt) 我发现%FILENAME%中的反斜杠只是转义下一个字母 我怎样才能把它们折叠起来,让它们逃脱呢 (我已经安装了cygwin,因此可以随意使用任何其他*nix命令) 解决方案 结合Jere

我想转义一个DOS文件名,这样我就可以将它与sed一起使用。我有一个DOS批处理文件,如下所示:

set FILENAME=%~f1

sed 's/Some Pattern/%FILENAME%/' inputfile
(注意:
%~f1
-将
%1
扩展为完全限定的路径名-
C:\utils\MyFile.txt

我发现
%FILENAME%
中的反斜杠只是转义下一个字母

我怎样才能把它们折叠起来,让它们逃脱呢

(我已经安装了cygwin,因此可以随意使用任何其他*nix命令)

解决方案 结合Jeremy和Alexandru Nedelcu的建议,在sed命令中使用|作为分隔符

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

这会奏效的。这很混乱,因为在BAT文件中不能像在unix中那样使用set var=`cmd`。 echo不理解引号的事实也很混乱,如果
某些模式
包含shell元字符,则可能会导致问题

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

[编辑]:我很惊讶它对你不起作用。我刚刚测试过,它在我的机器上工作。我正在使用sed from并使用cmd.exe在bat文件中运行这些命令。

您也可以尝试(从命令提示符)


您可以猜到,它将反斜杠转换为斜杠。

@Alexandru&Jeremy,谢谢您的帮助。你们俩都得到了选票

@杰里米

使用您的方法,我得到了以下错误:

sed:-e表达式#1,字符8: 未终止的's'命令

如果你能修改你的答案,使它工作,我会接受它。(粘贴我的解决方案不算数)

更新:好的,我用UnixUtils试过了,效果不错。(作为参考,我下载的UnixUtils日期为2007年3月1日,使用GNU sed版本3.02,我的Cygwin安装版本为GNU sed版本4.1.5)

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