2016-06-16 5 views
0

elasticsearch.ymlファイルがあります。Bash:パラメータを使用して設定ファイルのパスを置き換えます。

ユーザ入力に基づいてpath.dataとpath.logsの値を更新する必要があります。

パスとして引数をとり、文字列を置き換える.shスクリプトを作成しましたが、空の値に置き換えられました。スクリプトの下

この

sed -i.bak -e 's/# path.data:.*/ path.data: $2 /' "$1" 
sed -i.bak -e 's/# path.logs:.*/ path.logs: $3 /' "$1" 

を使用しています:./updateconfig.sh /usr/local/elasticsearch/config/elasticsearch.yml /var/lib/elasticsearch /var/log/elasticsearch

は、私は、二重過ぎる引用符( ")が、運を試してみました

は、あなたがこの上で私を助けてください。

更新

例異なるオプションで

をしようとしたとき、例えば、エラーを追加:

sed -i.bak -e "s/# path.data:.*/ path.data: $2 /" "$1" 
sed -i.bak -e 's># path.data:.*> path.data: $2 >' "$1" 
sed -i.bak -e "'s># path.data:.*> path.data: $2 >'" "$1" 

エラー:sedの

:-e式#1、CHAR 32:不明オプションs' sed: -e expression #1, char 1: unknown command: ''

+0

二重引用符を使用する必要があります。使用する例を示してください。 – 123

+0

二重引用符を使用するとエラーが発生する sed:-e式#1、char 32: 's 'に未知のオプション 例:sed -i.bak -e" s /#path.data:.* /パス。データ:$ 2/"" $ 1 " –

+2

別の区切り文字を使用 – 123

答えて

1

here以上の例からsedと多少マングリングして、変数名が前に知られている場合、私は、これらのコマンドを動作させることができた: - :$1$2$3前に引数を受け取った後

sed -i -e "s|^path.data.*|path.data:$2$1|g" -e "s|^path.logs.*|path.logs:$3$1|g" file 

私のサンプルファイルは、以下のようなダミーであると仮定すると、実際の変数名持つ: -

path.data:/l/m/n 
path.logs:/d/e/f 
0123を以下のスクリプトで

は、OPに必要に応じてパスのインプレース置換を行うことができる午前: - スクリプトを実行するには

#!/bin/bash 

sed -i -e "s|^path.data.*|path.data:$2$1|g" -e "s|^path.logs.*|path.logs:$3$1|g" file 

: -

$ ./script.sh /usr/local/elasticsearch/config/elasticsearch.yml /var/lib/elasticsearch /var/log/elasticsearch 

オリジナルの内容を検証するには今ファイル: - tripleee's提案へ

path.data:/var/lib/elasticsearch/usr/local/elasticsearch/config/elasticsearch.yml 
path.logs:/var/log/elasticsearch/usr/local/elasticsearch/config/elasticsearch.yml 

おかげで、私は今、その場で置換を行うことができますよ!

+1

複数の '-e'オプションがあります(例:http://stackoverflow.com/questions/7657647/combining-2-sed-commands)。 – tripleee

関連する問題