【问题标题】:DOS filename escaping for use with *nix commandsDOS 文件名转义以与 *nix 命令一起使用
【发布时间】:2010-09-07 07:26:06
【问题描述】:

我想转义一个 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

【问题讨论】:

    标签: scripting shell dos


    【解决方案1】:

    这会奏效。这很混乱,因为在 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 文件中运行这些命令。

    【讨论】:

      【解决方案2】:

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

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

      如您所料,它将反斜杠转换为斜杠。

      【讨论】:

        【解决方案3】:

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

        @杰里米

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

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-05-17
          • 1970-01-01
          • 1970-01-01
          • 2014-12-23
          • 1970-01-01
          相关资源
          最近更新 更多