题
我想转义 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)
不隶属于 StackOverflow