2017-02-01 13 views
1

私はsedを使用して、ファイル内(変数名にちなんで名付けられた)プレースホルダを置き換えることができます。代替シェル変数の参照

$clientId = '${ID}'; 
$clientSecret = '${SECRET}'; 

ID="toto" 
SECRET="tata" 
sed -i -e "s/\${ID}/$ID/" -e "s/\${SECRET}/$SECRET/" $file 

それは、この置き換えを

$clientId = 'toto'; 
$clientSecret = 'tata'; 

私は引数を使用してループを介してこの作業をしようとしています:

ID="toto" 
SECRET="tata" 
OTHER="franck" 
./config.sh $file $ID $SECRET $OTHER 

config.sh

for var in "${@:2}"; do 
    echo "$var" # toto or tata or franck 
    echo $!{var} # always var whatever I try, would like ID or {SECRET} or ${OTHER} 
    SETTINGS="$SETTINGS -e "s/\${var}/$var/"" # so this has no effect 
done 

FILE=$1 
sed -i $SETTINGS $FILE 

答えて

1

あなたが問題を修正するためにあなたのconfig.sh少し書き換えることができます。変数名とないそれらの値を渡す必要があります:

export ID="toto" SECRET="tata" OTHER="franck" 
./config.sh file ID SECRET OTHER 

それとも、export行うにはしたくない場合:スクリプトによって生成

ID="toto" SECRET="tata" OTHER="franck" ./config.sh file ID SECRET OTHER 

sedの式:

-e 's/${ID}/toto/' -e 's/${SECRET}/tata/' -e 's/${OTHER}/franck/' 

上記の電話後のファイル:

$clientId = 'toto'; 
$clientSecret = 'tata'; 
$publication = 'franck'; 
+0

素晴らしいです、ありがとうございます。 – kursus

+0

'sed'コマンドは' $ sed_expr'が期待どおりに動作していてもスクリプト内で動作しませんが、 'sed:-e expression#1、char 2:unknown command:' -''を取得します。ターミナルで全く同じ出力コマンドを実行すると、期待どおりに動作します。これについての考えは? – kursus

+0

シングルクォート、 'e'オプションを削除し、ループ内で' sed'コマンドを実行することで解決しました。ありがとうございました。 – kursus

1

は、あなたが、その後、sed一連のコマンドにデータを編集(sedにスクリプトを与えること-f /dev/stdinを使用するsedを使用して実行したいsedスクリプトを生成しています自身の背後にある一時ファイルをクリーンアップする必要はありません)。

FILE="$1" 
shift 
printf '%s\n' "[email protected]" | 
sed 's/^\([A-Z][A-Z]*\)=\(.*\)/s%\\${\1}%\2%/' | 
sed -i.bak -f /dev/stdin "$FILE" 

ヌルバックアップサフィックス表記は、BSD(MacOSの)sedでは動作しないので、私はサフィックスとして.bak置換しました。

これは呼び出しを想定しているが形式である:名前と値

file="data" 
ID="toto" 
SECRET="tata" 
OTHER="franck" 
./config.sh $file "ID=$ID" "SECRET=$SECRET" "OTHER=$OTHER" 

の両方が提供されなければなりません。

$clientId = '${ID}'; 
$clientSecret = '${SECRET}'; 
$publication = '${OTHER}'; 

出力ファイルは次のとおりです:含むデータファイルdataを考えると

$clientId = 'toto'; 
$clientSecret = 'tata'; 
$pulication = 'franck'; 

生成されたスクリプトの形式は次のとおりです。

s%\${ID}%toto% 
s%\${SECRET}%tata% 
s%\${OTHER}%franck% 

があなたの代わりに未使用の文字を使用することができますシンボル; %; Control-Aなどの制御文字は非常に効果的です。

# grab the output file name 
file=$1 
shift 
# loop through the rest of args which are names of variables that 
# need to be substituted 
for var in "${@}"; do 
    # note: ${var} and ${!var} do get evaluated inside single quotes so long as 
    # there are enclosing double quotes around them 
    sed_expr=${sed_expr}" -e 's/\${$var}/${!var}/'" 
done 

# enclose sed_expr as well file in double quotes to prevent 
# word splitting and globbig 
sed -i "$sed_expr" "$file" 

をし、以下のようにそれを呼び出す:

関連する問題