テンプレートのプレースホルダを置き換える

テンプレートのプレースホルダを置き換える

次のシェル構成ファイルがあるとします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"

おすすめ記事