DOS文件名转义以与* nix命令一起使用
时间:2020-03-05 18:45:13 来源:igfitidea点击:
我想转义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
。
回声无法理解引号的事实也很混乱,如果"某些模式"包含外壳元字符,则可能导致麻烦。
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文件中运行这些命令。
回答
我们可以尝试替代方法(在命令提示符下)...
> cygpath -m c:\some\path c:/some/path
如我们所料,它将反斜杠转换为斜杠。
回答
@Alexandru&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版)