2013-08-28 51 views
3

我想編譯一個大型項目,我從互聯網下載,我有一個自定義腳本,運行configure,make和make install。問題是我想傳遞一些兼容性標誌,但是項目使用了不能識別LDFLAGS的libtool,我必須找到另一種方式來傳遞我的兼容性標誌。因此,在運行configure後,我的劇本我有代碼看起來像這樣:sed不能與變量

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},它仍然不起作用。我不知道爲什麼會出現問題。任何想法?

回答

5

由於COMPATFLAG確實有斜線,你應該在sed使用正則表達式不同的分隔符:

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

而且我也爲了避免在替換模式匹配字符串的重複使用#在這裏。

感謝@JonathanLeffler爲這個技巧,你甚至可以用一個控制字符爲正則表達式分隔符:在外殼

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

^G類型爲ctrl-V-G

+1

另一個技巧是使用控制字符(如control-A或control-G)作爲分隔符; 「sed」不介意,與爭論衝突的可能性很小。 –

+0

優秀點@JonathanLeffler。 – anubhava

+1

甚至是'$'\ xFF'':'D = $'\ xFF'; sed -i「s $ {D} CC -shared $ {D}&$ {COMPATFLAG} $ {D} g」libtool' – konsolebox

2

您可以使用管道|代替/用雙引號。這適用於全局變量,包括/

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