私のプロジェクトでは、テンプレートファイルに基づいていくつかのファイルを生成する方法が必要です。私が想像するのはこんな感じです。
テンプレートファイルには、
{{var1}}
置き換える変数に似たデータが含まれています。key = value
他のファイルには値のリストが含まれています。ツールを適用した後、特定の値を含む新しいファイルを作成する必要があります。
2番目のファイルの代わりにコマンドラインを介してペアリストを提供することもできますkey = value
が、同様に、一部のキーには2番目のファイルのキー値ではなく環境変数が必要な場合があります。
どこ標準およびよく知られたユーティリティ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\"