sed不能使用variables

我想编译一个我从互联网上下载的大型项目,我有一个自定义脚本来运行configure,make和make install。 问题是,我想通过一些兼容性标志,但项目使用libtool不能识别LDFLAGS,我必须find另一种方式来传递我的兼容性标志。 所以在我的脚本运行configuration后,我有看起来像这样的代码:

COMPATFLAG="-gcc-name=/usr/local/gcc-4.2.1/bin/gcc" sed -i "s/CC -shared/CC -shared ${COMPATFLAG}/g" libtool 

${COMPATFLAG}可能会得到不同的值,这取决于正在编译的平台,所以我不能在sed语句中以明文forms表示。 问题是它不起作用 – 我得到一个空的空间,而不是${COMPATFLAG}的值。 如果我改为写入sed -i "s/CC -shared/CC -shared TEST/g" libtool ,它将string“TEST”添加到文件中。 如果我使用单引号,我得到${COMPATFLAG}string,而不是variables的值。 如果我尝试导出${COMPATFLAG}它仍然不起作用。 我不知道为什么会出错。 任何想法?

由于COMPATFLAG确实有正斜杠,所以在sed中应该使用不同的正则表达式分隔符:

 sed -i "s#CC -shared#& ${COMPATFLAG}#g" libtool 

此外,我在这里使用#以避免在替换模式中重复匹配的字符串。

感谢@JonathanLeffler的这个提示,你甚至可以使用控制字符作为正则表达式分隔符:

 sed -i "s^GCC -shared^G& ${COMPATFLAG}^Gg" libtool 

在shell中输入^G作为ctrl-VG

你可以使用pipe | 而不是/用双引号。 这适用于包含/的全局变量。

 sed -e "s|CC -shared|CC -shared ${COMPATFLAG}|g" libtool