DOS文件名转义与* nix命令一起使用

时间:2008-08-29 20:56:03

标签: scripting shell dos

我想转义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

3 个答案:

答案 0 :(得分:2)

这会奏效。这很麻烦,因为在BAT文件中你不能像unix那样使用set var =`cmd`。 echo不理解引号的事实也很混乱,如果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文件中运行这些命令。

答案 1 :(得分:2)

你可以尝试替代(从命令提示符)......

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

正如你猜测的那样,它会将反斜杠转换为斜杠。

答案 2 :(得分:0)

@Alexandru&杰里米,谢谢你的帮助。你们都得到了支持

@Jeremy

使用您的方法我收到以下错误:

  

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

如果您可以编辑您的答案以使其正常工作,我会接受它。 (粘贴我的解决方案不算)

更新:好的,我尝试使用UnixUtils并且它有效。 (作为参考,我下载的UnixUtils日期为2007年3月1日,使用GNU sed版本3.02,我的Cygwin安装有GNU sed版本4.1.5)