2011-01-07 154 views
0

我設立在外殼的變量:SED變量替換似乎不工作

-bash-3.00$ echo $source_repl 
source ../setup_simple.tcl 

我又試圖取代以字符串開始一個文件中的行「包需要的IxLoad」與變量字符串(注意雙引號是讓sed使用變量替換的方式)。首先,我試着用直接替換(無法迴避的變量$):

-bash-3.00$ sed -e "s/package require IxLoad.*/$source_repl/g" smtp_tput191Mb.tcl > tmpwatch.tcl 
sed: -e expression #1, char 38: unknown option to `s' 
-bash-3.00$ 

所以我認爲逃避$將解決這個問題,但你可以看到該行再由文本字符串替換「$ source_repl」,而不是變量保存在那裏:

-bash-3.00$ sed -e "s/package require IxLoad.*/\$source_repl/g" smtp_tput191Mb.tcl > tmpwatch.tcl 
-bash-3.00$ diff smtp_tput191Mb.tcl tmpwatch.tcl 
11c11 
< package require IxLoad 
--- 
> $source_repl 
-bash-3.00$ 

我擡頭就如何做好SED變量替換,他們都似乎表明,上述工作應許多網站。我錯過了什麼?實際變量中是否存在導致此問題的內容?

一個

回答

0

對不起浪費時間的人。我發現了這個問題。我需要逃脫點和斜線的實際變量,以便與sed的語句來代替它:

-bash-3.00$ echo $source_repl 
source \.\.\/setup_simple\.tcl 
-bash-3.00$ sed -e "s/package require IxLoad.*/$source_repl/g" smtp_tput191Mb.tcl > tmpwatch.tcl 
-bash-3.00$ diff smtp_tput191Mb.tcl tmpwatch.tcl           11c11 
< package require IxLoad 
--- 
> source ../setup_simple.tcl 
-bash-3.00$ 

感謝

+1

當它們位於's ///'命令的右側時,不需要轉義這些點。 –

1

。在你的變量/。使用@作爲模式分隔符,這將會發生。

sed -e "[email protected] require IxLoad.*@[email protected]" smtp_tput191Mb.tcl > tmpwatch.tcl 
+0

感謝。我只注意到了這一點。我以錯誤的方式盯着問題。 – amadain

1

我不知道如何在一般工作圍繞這一問題(改變隔板很容易,但你永遠不知道什麼可以在可變的),但是如果你可以使用perl代替sed,你可以在perl中加載環境變量表格以避免轉義問題:

perl -pe 's/package require IxLoad.*/$ENV{source_repl}/g' smtp_tput191Mb.tcl > tmpwatch.tcl