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

3

我希望能够转义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个回答

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,并在bat文件中使用cmd.exe运行这些命令。


2
您可以尝试作为替代方案(从命令提示符)...
> cygpath -m c:\some\path
c:/some/path

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


0

@Alexandru & Jeremy,感谢你们的帮助。你们两个都得到了赞

@Jeremy

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

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

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接