我想转义 DOS 文件名,以便可以将其与 sed 一起使用。我有一个 DOS 批处理文件,如下所示:

set FILENAME=%~f1

sed 's/Some Pattern/%FILENAME%/' inputfile

(笔记: %~f1 - 扩大 %1 完全限定路径名 - C:\utils\MyFile.txt)

我发现反斜杠在 %FILENAME% 只是转义下一个字母。

我怎样才能把它们加倍才能逃脱呢?

(我安装了 cygwin,所以可以随意使用任何其他 *nix 命令)

解决方案

结合杰里米和亚历山德鲁·内德尔库的建议,并使用|对于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` 。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

[编辑]:我很惊讶它对你不起作用。我刚刚测试了它,它在我的机器上运行。我正在使用 sed http://sourceforge.net/projects/unxutils 并使用 cmd.exe 在 bat 文件中运行这些命令。

其他提示

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

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

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

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

@杰里米

使用你的方法我得到以下错误:

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top