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
4

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

于 2008-08-29T21:58:36.340 回答
2

您可以尝试作为替代方案(从命令提示符)...

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

您可以猜到,它将反斜杠转换为斜杠。

于 2008-08-29T22:00:20.000 回答
0

@Alexandru & Jeremy,感谢您的帮助。你们都得到了赞成票

@杰里米

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

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

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

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

于 2008-08-29T22:29:58.790 回答