次のシェル構成ファイルがあるとしますconfig
。
HOST=localhost
PORT=8080
template
これで、次のテンプレートがあります。
The host is <%= @HOST %>
The port is <%= @PORT %>
template
プレースホルダをファイルの値に置き換える方法は?config
もちろん、私はこれを行うことができます:
$ . config
$ sed -e "s/<%= @HOST %>/$HOST/" \
> -e "s/<%= @PORT %>/$PORT/" < template
The host is localhost
The port is 8080
ただし、設定値が多いと面倒になります。もっと一般的な方法でこれを行うにはどうすればよいですか?各プレースホルダを繰り返して実際の値に置き換えたいです。
ベストアンサー1
次のことができます。
eval "cat << __end_of_template__
$(sed 's/[\$`]/\\&/g;s/<%= @\([^ ]*\) %>/${\1}/g' < template)
__end_of_template__"
つまり、sed と文字の両方をエスケープしてから置換し、<%= @xxx %>
シェルに拡張を実行させます。${xxx}
$
\
`
template
または、行が含まれていないと保証できない場合__end_of_template__
:
eval "cut -c2- << x
$(sed 's/[\$`]/\\&/g;s/<%= @\([^ ]*\) %>/${\1}/g;s/^/y/' < template)
x"