我想编译一个我从互联网上下载的大型项目,我有一个自定义脚本来运行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