cmd - sed命令输入解析错误

问题描述:

我正在翻译一个GNU MakefileMSBuild XML。cmd - sed命令输入解析错误

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

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

当我执行只是在Cygwinsed部分,它“作品”在这个意义上,它并不会报错了。

不过,我已经将它转换为XML MSBuild后 - 取代了XML敏感的符号与"&' - 我得到的错误

sed的:不支持的命令“

我确信这不是XML转义问题的问题;在Visual Studio生成日志说

任务参数:命令= “C:\ Program Files文件\ GNU ARM的Eclipse \构建工具\ 2.8-201611221915 \ BIN \ sed的”“S/^ Q /”(*)。 &“/ '(任务id:21)

sed的:不支持的命令'(任务id:21)

命令 “” C:\ Program Files文件\ GNU ARM的Eclipse \构建工具\ 2.8-201611221915 \ BIN \ (TaskId:21)

('*)/'Q(*)/“&”/'“该命令被翻译成最初打算的sed 's/^Q(.*)/"&"/'

但是,现在似乎有一个问题与cmd.exe

关于cmd.exe,该命令的哪部分不是这样的?
是单/双引号吗?和号?

我使用表from here

+0

不知道,因为它似乎是你正在使用的'sed'版本,它反对它正在接收的命令。如果你确定'cmd'不能协同工作,那么'cmd'将''''''''''''作为特殊字符。我试着用'^'转义每一个,所以''s/^^ Q(。* ^)/“^&”/'' - '^'通常会转义'cmd'中的有问题的字符 - %' ''''' – Magoo

+0

@Magoo我把''s/^ Q(。*)/“&”/''放在一个文本文件中,并把它叫做'sed -f sedCmd.txt',我得到了同样的错误信息。这缩小了什么? – Adrian

+0

这似乎与'bash'没有任何关系 – chepner

在Unix/Linux/Mac的支持外壳口译至少三种类型的参数字符串:

  1. 无报价不包含与命令解释程序有特殊的意义空格字符或简单的字符串参数字符串。
  2. "带引号的字符串中包含空格字符的字符串或带有特殊含义的字符,不含包含"的shell解释器。
  3. '带引号的字符串包含空格字符的字符串或带有特殊含义的字符,不包含'的shell解释器。

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

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

为此正则表达式字符串作为含有"参数字符串是在Windows问题的,因为存在用于作为引用参数字符串* nix中/ Mac的壳没有替代的解决方案。

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

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

但是,命令行参数字符串最终是由被调用的应用程序处理的,它取决于应用程序和使用的编译器应用程序如何解释参数。因此,它总是取决于应用程序的最终工作。请参阅C代码this answer以及运行此代码时使用三个不同的编译器编译错误参数字符串的两种不同结果。为参数字符串的应用程序相关的解释再如在回答解释上How to set environment variables with spaces?

对于使用刚刚s/^Q(.*)/"&"/因此没有封闭在单引号'作品在Windows上的sed太正则表达式参数字符串。