定期的にテンプレートを使用して100を超えるテキストファイルを作成する必要があります。
現在使用しているシェルスクリプトが複雑すぎます。この問題を処理するより賢い方法があると思いますが、方法がわかりません。
「データベース」があります。
# outputfile template data1 data2 data3
first.txt $template_main $text1 abcd 1234
second.txt $template_main $text2 efgh 5678
third.txt $template_other $text1 ij 90
および設定ファイル:
template_main=main.txt
template_other=other.txt
text1=whatever
text2=blah
テンプレートは、%%data2%%などのプレースホルダを持つテキストファイルです(プレースホルダの形式は変更される可能性があります)。
複雑なシェルスクリプトを使用するよりも自動化できるツールを知っている人はいますか?
答え1
以下を考慮することもできます。
m4
目的のテキストを出力し、それを変更したい部分を含む入力テンプレートとして使用するテキストプロセッサであるGNUツール。確かにシェルスクリプトよりも簡単です。 (#defineマクロIIRCを使用したCプリプロセッサのように動作します。)xsltproc
変換を適用して出力を提供するGNUツールです。テンプレートは、xml
テキストを出力するためにxslt
実行したい変換形式です。xml
個人的に私はそれを好みますxslt
が、あなたの場合はフォームのフィールドには合いません %DATA1%
%DATA2%
。テンプレートを変更したくないので、xmlが必要です。
だからあなたは本当にそれを確認する必要がありますm4
。
- あるいは、プログラミング言語はストリーム変換に非常に熟練していると言われています
Haskell
。私がこのアイデアを考えたのは、Haskell愛好家がParsec
文字列ストリームを自然に解析できるこの素晴らしいパッケージについて話しているからです。 xsltよりはるかに優れています。すでにとても良いです。私はHaskellを学び、現在はHaskellにテキストを変換する方法がわからないので繰り返しています。。
答え2
おそらく何千ものテンプレート言語と関連ソフトウェアがあります。人気のある例は次のとおりです。欧州研究機関、これはバニラRubyの一部です。 Rubyをインストールした後、エディタを実行してirb
標準的な例を貼り付けるだけで感じが得られます。
require 'erb'
x = 42
template = ERB.new <<-EOF
The value of x is: <%= x %>
EOF
puts template.result(binding)
答え3
なぜこれを行うのかわかりませんが、ここには2つのテンプレートがあります。 1つは「データベース」で、もう1つは実際のテンプレートです。どちらも扱いやすいです。stpl。 (私の個人的なプロジェクトとは広く使われていませんが、実際にこの問題を解決するために開発されました)
shtplを使用すると、次のことができます。
「構成」ファイルの内容:
template_main=main.txt
template_other=other.txt
text1=whatever
text2=blah
"database"ファイルの内容(区切り文字はタブ(\ t)であると仮定します):
#% . "$CONFFile"
#% if [ -z "$template_main" ] || [ -z "$template_other" ] || \
#% [ -z "$text1" ] || [ -z "$text2" ]; then
#% printf "database could not be generated!\n" > /dev/stderr
#% exit 1
#% fi
#%# outputfile template data1 data2 data3
first.txt $template_main $text1 abcd 1234
second.txt $template_main $text2 efgh 5678
third.txt $template_other $text1 ij 90
generatetemplates.shの内容:
#!/bin/bash
if [ ! -s "$CONFFile" ]; then
if [ ! -s "$1" ]; then
printf "CONFfile is not set or empty!\n"
exit 1
else
export CONFFile="$1"
fi
fi
DB="$( bash -c "$( shtpl database )" )"
if [ -z "$DB" ]; then
printf "Database is empty! Abort.\n"
exit 2
fi
IFS=$'\t'
printf "%s" "$DB" | while read "Out" "In" "data1" "data2" "data3"; do
data1="$data1" data2="$data2" data3="$data3" \
bash -c "$( shtpl "$In" )" > "$Out"
done
main.txtの内容(other.txtと同じ):
main.txt template
$data1
$data2
$data3
したがって、generatetemplates.shを実行してください。
$ bash generatetemplates.sh "./configuration"
最初の.txt、2番目の.txt、3番目の.txtを生成します。
$ cat first.txt | $ cat second.txt | $ cat third.txt
main.txt template | main.txt template | other.txt template
whatever | blah | whatever
abcd | efgh | ij
1234 | 5678 | 90
簡単な説明:generatetemplates.shの最初のステップは、設定ファイルに必要な「データベース」を作成することです。第二に、データベースの各タプルについて、最後に内部テンプレートの対応する出力ファイルがあります。
注:データ[123]が空の場合、読み取りは困難になります。したがって、このアプローチは不可能です。
したがって、これはあなたのニーズに十分簡単であることを願っています。
楽しくお過ごしください!
答え4
私は最近、これを達成するためにjinjaに似たテンプレート構文を使用するオープンソースプロジェクトをリリースしました。知られているクッキー。以下はデモです: