基于模板生成文件的简单而标准的方法?

基于模板生成文件的简单而标准的方法?

对于我的项目,我需要一种基于模板文件生成一些文件的方法。我设想是这样的:

  • 模板文件包含类似于{{var1}}要替换的变量的数据

  • key = value其他文件包含值列表

  • 应用工具后,应生成一个包含具体值的新文件

可以通过命令行提供对的列表,而不是第二个文件key = value,或者,同样的,某些键可能需要环境变量而不是第二个文件中的键值。

在那儿标准和众所周知的实用程序在Linux/Unix世界中使用可以做到这一点吗?

答案1

编写这样的脚本确实很容易。例如,您可以来源成对的文件key=value,然后用它来替换模板的内容。例如:

$ cat template
Hello $name,
someone told me you really like $thing!

$ cat values
name=Bob
thing=chocolate

那么你的脚本将是:

#!/bin/sh

## source the key/value pairs
. "$1"

## Replace them in the template
sed -e "s/\\\$name/$name/g" -e "s/\\\$thing/$thing/g" "$2"

你像这样运行它:

$ foo.sh /full/path/to/values template
Hello Bob,
someone told me you really like chocolate!

当然,这需要您提前知道按键的名称。另一种选择是:

#!/bin/sh

tmpFile=$(mktemp)
cp -- "$2" "$tmpFile"

while IFS='=' read -r key value; do
  sed -i -e "s/\$$key/$value/g" "$tmpFile"
done < "$1"

cat "$tmpFile"

另一种选择是使用eval扩展变量。然而,这是危险的,因为如果文件中的值可能是危险的,它会让您面临代码注入的风险。如果这对您来说不是问题,请尝试:

#!/bin/sh

## source the key/value pairs
. "$1"

## load the contents of the template
template="$(cat "$2")"
## Now print, but expanding the variables. We need to 
## unset IFS to protect the newlines.
IFS=
eval echo \"$template\"

相关内容