变量与sed命令无法正常工作

3

我正在尝试编译从互联网下载的一个大项目,并且我有一个自定义脚本,运行 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个回答

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


1
另一个技巧是使用控制字符(例如控制-A或控制-G)作为分隔符;sed不会介意,并且与参数冲突的可能性微乎其微。 - Jonathan Leffler
1
甚至包括 $'\xFF': D=$'\xFF'; sed -i "s${D}CC -shared${D}& ${COMPATFLAG}${D}g" libtool - konsolebox

3

您可以使用管道符 | 来代替单斜线/,并在双引号中使用。这适用于包含/的全局变量。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接