我正在将GNU Makefile
翻译成MSBuild
XML。
我有以下sed
命令(较大命令的一部分):
... | sed 's/^Q(.*)/"&"/' | ...
当我在sed
中执行Cygwin
部分时,它“有效”,因为它不会出错。
但是,在我将其翻译为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:unsupported command'(TaskId:21)
命令“”C:\ Program Files \ GNU ARM Eclipse \ Build Tools \ 2.8-201611221915 \ bin \ sed“'s / ^ Q(。*)/”&“/'”退出代码1。 (TASKID:21)
该命令已转换为最初预期的sed 's/^Q(.*)/"&"/'
但是,现在cmd.exe
似乎存在问题。
关于cmd.exe
,该命令的哪一部分不喜欢?
这是单/双引号吗? &符号?
我正在使用表from here。
答案 0 :(得分:2)
Unix / Linux / Mac上的shell解释器支持至少三种类型的参数字符串:
"
引用包含空格字符的字符串的参数字符串或不包含"
的shell解释器具有特殊含义的字符。'
引用包含空格字符的字符串的参数字符串或不包含'
的shell解释器具有特殊含义的字符。Windows命令行解释器仅支持两种类型的参数字符串。
&()[]{}^=;!'+,`~|<>
。"
引用包含空格字符的字符串的参数字符串或不包含"
的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 。