テンプレートからテキストファイルを生成するツール

テンプレートからテキストファイルを生成するツール

定期的にテンプレートを使用して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に似たテンプレート構文を使用するオープンソースプロジェクトをリリースしました。知られているクッキー。以下はデモです:

クッキーデモ

関連情報