2012-02-08 21 views
0

設定ファイルの{$pear_root}のインスタンスをシェルスクリプトの$PEAR_ROOT変数に置き換えようとしています。 「バッシュエスケープ文字に関する注意」の下hereからメソッドを使用してシンプルなBASH文字列置換

は私が持っている:

ESC_PEAR_ROOT="${PEAR_ROOT//\//\\/}" 
sed -i "s/{\$pear_root}/${ESC_PEAR_ROOT}/"../.serverconfig/test.txt 

私は戻って34を取得しています:私は、これはサポートされていないことを意味するかもしれないと思う悪い置換を。

またはperlでこれを行うかどうかにかかわらず、同じエラーが発生するため、問題はs/find/replace/を使用しているようです。

APP_ROOT=$(php ./scripts/get_realpath.php '../') 
PEAR_ROOT="$APP_ROOT/pear" 
ESC_PEAR_ROOT="${PEAR_ROOT//\//\\/}" 
sed -e "s/{\$pear_root}/${ESC_PEAR_ROOT}/"../.serverconfig/test.txt 

そしてPEAR_ROOTからのパスに置き換えtest.txt{$pear_root}のすべてのインスタンスで終わる:

これを実行する最も簡単な方法は何ですか?

私はこの方法には添付されていません。信頼できる方法はありません。

+0

最終結果はと終わりましたか?あなたは例を挙げることができますか? –

+0

あなたは式の第2部分で$をエスケープしていません。 – John3136

+0

@evil otto:ESC_PEAR_ROOTはすべてのスラッシュがあった場所で終わると思います。私はこの1つのステートメントのためにそれを必要としますが、後で使うために元のPEAR_ROOTも必要です。したがって、PEAR_ROOTをエスケープした場合、後でパスとして使用することはできません。 – Eli

答えて

2

[OK]を解決しました。

問題ました:

この:私の "悪い置換" エラーを引き起こしていたものだったこと

ESC_PEAR_ROOT="{PEAR_ROOT//\//\\/}" 

ESC_PEAR_ROOT="${PEAR_ROOT//\//\\/}" 

は、このされている必要があります。

また、私は別の区切り文字をsに使うことができるので、私はエスケープする必要がないことに気がついたので、その行は必要ありません。あなたはESC_PEAR_ROOTに代わりのPEAR_ROOTを設定しようとしているものを

APP_ROOT=$(php ./scripts/get_realpath.php '../') 
PEAR_ROOT="$APP_ROOT/pear" 
sed -i "s#{\$pear_root}#${PEAR_ROOT}#g" ../.serverconfig/test.txt 
3

これはちょっとばかですが、式の末尾と適用したいファイルの名前の間にスペースがありません。

/tmp $ sed -e 's/{$pear_root}/'"$PATH"'/' test 
/tmp $ sed -e 's/{$pear_root}/'"$PATH"'/'test 
sed: bad option in substitution expression 
+0

はい、良いキャッチです。私はそれを修正しましたが、余分な "$"はそれを殺していたものです。 – Eli