![在反引号中使用 sed 实用程序有什么问题?](https://linux22.com/image/1513827/%E5%9C%A8%E5%8F%8D%E5%BC%95%E5%8F%B7%E4%B8%AD%E4%BD%BF%E7%94%A8%20sed%20%E5%AE%9E%E7%94%A8%E7%A8%8B%E5%BA%8F%E6%9C%89%E4%BB%80%E4%B9%88%E9%97%AE%E9%A2%98%EF%BC%9F.png)
我在 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')