在反引号中使用 sed 实用程序有什么问题?

在反引号中使用 sed 实用程序有什么问题?

我在 64 位 Windows 上运行 mingw/msys shell,下面是我的会话。

USER@FX8300 ~
$ echo $WD
C:\Users\USER\Desktop\msys\\bin\

USER@FX8300 ~
$ echo $WD | sed -e 's/\\bin\\//; s/\\/\//g'
C:/Users/USER/Desktop/msys/

USER@FX8300 ~
$ export W32BASE=`echo $WD | sed -e 's/\\bin\\//; s/\\/\//g'`
sed: -e expression #1, char 14: unknown option to `s'

现在我想知道为什么 echo/sed 组合在反引号中会失败,而单独发出时却可以正常工作?

答案1

命令替换可以通过您使用的反引号或 $() 来完成。

来自 bash 参考:

当使用旧式反引号形式的替换时,反斜杠保留其字面含义,除非其后跟有“$”、“`”或“\”。第一个前面没有反斜杠的反引号终止命令替换。当使用 $(command) 形式时,括号之间的所有字符都构成命令;没有一个字符会被特殊处理。

来源:https://www.gnu.org/software/bash/manual/html_node/Command-Substitution.html

在您的示例中,您正在转义第二个正斜杠,这会破坏您的命令(除了不匹配您的字符串之外)。

如果您想继续使用反引号,您的命令应该是:

 W32BASE=`echo $WD | sed 's/\\\\bin\\\\//g;s/\\\\/\\//g'`

当您使用 $() 时,反斜杠将按照您通常期望的方式处理,您的命令将是:

 W32BASE=$(echo $WD | sed 's/\\bin\\//g;s/\\/\//g')

相关内容