3

我正在尝试编译一个从 Internet 下载的大型项目,并且我有一个自定义脚本可以运行 configure、make 和 make install。问题是我想传递一些兼容性标志,但该项目使用的 libtool 无法识别 LDFLAGS,我必须找到另一种方法来传递我的兼容性标志。因此,在运行配置后的脚本中,我的代码如下所示:

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

${COMPATFLAG}可能会根据正在编译的平台获得不同的值,因此我无法在 sed 语句中以明文形式将其放入。问题是它不起作用 - 我得到一个空白空间而不是${COMPATFLAG}. 如果我改为编写sed -i "s/CC -shared/CC -shared TEST/g" libtool它会将字符串“TEST”添加到文件中。如果我使用单引号,我会得到${COMPATFLAG}字符串而不是变量的值。如果我尝试导出${COMPATFLAG}它仍然不起作用。我不知道为什么会出错。任何想法?

4

2 回答 2

6

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

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

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

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

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

在 shell^G中输入ctrl-V-G

于 2013-08-28T17:11:39.407 回答
3

您可以使用管道|代替/双引号。这适用于包括/.

sed -e "s|CC -shared|CC -shared ${COMPATFLAG}|g" libtool
于 2013-08-28T17:13:29.093 回答