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版)