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