Scripting 用于*nix命令的DOS文件名转义
我想转义一个DOS文件名,这样我就可以将它与sed一起使用。我有一个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
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