2011-01-07 9 views
0

動作するようには思えません文字列(二重引用符はsedに変数置換を使用させる方法であることに注意してください)。だから私は$をエスケープしても問題が解決していますが、ラインがリテラル文字列で置き換え「$、その後で見ることができるようにと思っ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

あなたの変数で/があります。パターンセパレータとして@を使用すると、これが実行されます。あなたは、代わりにsedperlを使用することができる場合、私は(区切り文字を変更することは簡単ですが、あなたは、変数であることができるか分からない)一般的に周りにこの問題を作業する方法を知りませんが、

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

感謝。私はちょうどそれに気づいた。私は間違った方法で問題を見つめていた。 – amadain

1

エスケープする問題を避けるために、perlの中に環境変数の形式をロードすることができます:

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