不使用变量

时间:2013-08-28 17:08:11

标签: linux bash sed

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

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},它仍然无效。我不知道为什么会出错。有什么想法吗?

2 个答案:

答案 0 :(得分:6)

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

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

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

感谢@JonathanLeffler提供此技巧,您甚至可以将控制字符用作正则表达式分隔符:

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

在shell

中键入^Gctrl-V-G

答案 1 :(得分:3)

您可以使用竖线|代替/并使用双引号。这适用于包含/

的全局变量
sed -e "s|CC -shared|CC -shared ${COMPATFLAG}|g" libtool