Bash
替換模板中的佔位符
假設我有一個這樣的 shell 配置文件
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
但是如果有很多配置值,這變得太麻煩了。我將如何以更通用的方式做到這一點?我想遍歷每個佔位符並將其替換為實際值。
您可以執行以下操作:
eval "cat << __end_of_template__ $(sed 's/[\$`]/\\&/g;s/<%= @\([^ ]*\) %>/${\1}/g' < template) __end_of_template__"
也就是說,在轉義所有,和字元後,將所有 sed
<%= @xxx %>
替換為,並讓 shell 進行擴展。`${xxx}$
````或者如果你不能保證
template
不包含__end_of_template__
一行:eval "cut -c2- << x $(sed 's/[\$`]/\\&/g;s/<%= @\([^ ]*\) %>/${\1}/g;s/^/y/' < template) x"
一種
awk
方式:awk -F= 'FNR==NR{v[$1]=$2;next};{for(p in v)gsub("<%= @"p" %>",v[p])};1' config template
根據Stephane Chazelas 的評論進行了更新,以允許在值中使用“=”符號:
awk -F= 'FNR==NR{v[$1]=substr($0,length($1)+2);next};{for(p in v)gsub("<%= @"p" %>",v[p])};1' config template