我想转义 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
最佳答案
这会起作用。这很困惑,因为在 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 文件中运行这些命令。
关于scripting - DOS 文件名转义以与 *nix 命令一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35286/