【问题标题】:cmd - sed command input parse errorcmd - sed 命令输入解析错误
【发布时间】:2017-10-08 18:56:07
【问题描述】:

我正在将GNU Makefile 翻译成MSBuild XML。

我有以下sed 命令(较大命令的一部分):

... | sed 's/^Q(.*)/"&"/' | ...

当我只执行Cygwin 中的sed 部分时,它“有效”,因为它不会出错。

但是,在我将其翻译为 MSBuild XML 之后 - 将 XML 敏感符号替换为 "&' - 我得到了错误

sed: 不支持的命令'

我确定这不是 XML 转义问题; Visual Studio 构建日志说

任务参数:Command="C:\Program Files\GNU ARM Eclipse\Build Tools\2.8-201611221915\bin\sed" 's/^Q(.*)/"&"/' (TaskId:21)

sed: 不支持的命令' (TaskId:21)

命令 ""C:\Program Files\GNU ARM Eclipse\Build Tools\2.8-201611221915\bin\sed" 's/^Q(.*)/"&"/' " 以代码 1 退出。 (任务 ID:21)

命令被翻译成原意的sed 's/^Q(.*)/"&"/'

但是,cmd.exe 现在似乎存在问题。

关于cmd.exe,它不喜欢该命令的哪一部分?
是单引号/双引号吗? & 符号?

我正在使用表from here

【问题讨论】:

  • 不知道,因为它似乎是您正在使用的 sed 版本,它反对它正在接收的命令。如果您确定是cmd 不合作,那么cmd^)& 视为特殊字符。我会尝试用^ 转义每个's/^^Q(.*^)/"^&"/' - ^ 通常会转义cmd 中的有问题的字符 - 除了%% 转义
  • @Magoo 我将's/^Q(.*)/"&"/' 放在一个文本文件中,并像sed -f sedCmd.txt 一样调用它,我得到了相同的错误消息。这会缩小范围吗?
  • 这似乎与bash没有任何关系
  • 在插入符号的情况下,您可能需要转义转义字符's/^^^Q(.*)/"^&"/',我怀疑右括号是否需要转义。
  • @Adrian 当您为任何给定的命令编写command 'script' 时,'s 将分隔您的脚本,以便您的操作系统知道它从哪里开始/结束,然后将其传递给command。当您将script 放入要使用command -f 执行的文件中时,您需要放入文件中的部分只是脚本,而不是在命令行中分隔它的's。所以把s/^Q(.*)/"&"/放到脚本文件中而不是's/^Q(.*)/"&"/'再试一次。

标签: batch-file sed cmd msbuild


【解决方案1】:

Unix/Linux/Mac 上的 shell 解释器至少支持三种类型的参数字符串:

  1. 对于不包含空格字符或对 shell 解释器具有特殊含义的字符的简单字符串,不带引号的参数字符串。
  2. " 带引号的参数字符串用于包含空格字符或对不包含 " 的 shell 解释器具有特殊含义的字符。
  3. ' 带引号的参数字符串用于包含空格字符或对不包含 ' 的 shell 解释器具有特殊含义的字符。

Windows 命令行解释器仅支持两种类型的参数字符串。

  1. 不包含空格字符或以下字符之一的简单字符串的无引号参数字符串:&()[]{}^=;!'+,`~|<>
  2. " 引用的参数字符串用于包含空格字符或对 Windows 命令解释器具有特殊含义的字符,但不包含 "

因此,正则表达式字符串作为包含 " 的参数字符串在 Windows 上是有问题的,因为没有替代解决方案可以像在 *nix/Mac shell 上那样引用参数字符串。

Perl 语法中正则表达式的解决方案是在正则表达式中使用十六进制符号 \x22 表示双引号字符 "

所以"s/^Q(.*)/\x22&\x22/" 可以在 Windows 和 Linux 上运行,而不是 's/^Q(.*)/"&"/'

但是,命令行参数字符串最终由被调用的应用程序处理,这取决于应用程序和使用的编译器,应用程序如何解释参数。因此,它也始终取决于最终起作用的应用程序。请参阅this answer 中的 C 代码以及运行此代码的两个不同结果,这些代码是使用三个不同的编译器编译的,带有错误引用的参数字符串。在How to set environment variables with spaces?的回答中解释了另一个依赖于应用程序的参数字符串解释示例

因此,仅使用 s/^Q(.*)/"&"/ 而不将正则表达式参数字符串括在单引号中 ' 也适用于 Windows 上的 sed

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-05
    • 2015-08-02
    • 1970-01-01
    • 1970-01-01
    • 2012-10-29
    • 1970-01-01
    • 2017-09-08
    相关资源
    最近更新 更多