Bash

替換模板中的佔位符

  • March 11, 2017

假設我有一個這樣的 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

引用自:https://unix.stackexchange.com/questions/57731