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


9

テンプレートから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つを投稿すると、状況を理解するのに役立ちます。多分phpまたはperlスクリプトを試してください?文字列を処理するためのより強力で簡単な方法があります。
John Siu、


回答:


5

おそらく何千ものそのようなテンプレート言語と関連ソフトウェアがあります。人気のある例はERBで、これはバニラRubyの一部です。Rubyをインストールしたらirb、エディターまたはエディターを起動して、正規の例を貼り付けるだけで、感覚をつかむことができます。

require 'erb'

x = 42
template = ERB.new <<-EOF
  The value of x is: <%= x %>
EOF
puts template.result(binding)

5

次のことも検討できます。

  • 呼び出されるGNUツールm4は、変更するパーツを含むテンプレートを入力として受け取りたいテキストを出力するテキストプロセッサです。シェルスクリプトよりも確かに簡単でしょう。(それは#defineマクロIIRCでCプリプロセッサのように機能します)。

  • xsltproc変換を適用して出力を提供するGNUツール。テンプレートはにありxml、テキストを出力xsltするxmlために行う変換の形式です。

個人的に私はを好みxsltますが、あなたの場合、フォームのフィールドに適合しません %DATA1% %DATA2%。xmlが必要なので、テンプレートを変更するのは嫌です。

したがって、あなたは本当に見てみる必要がありますm4

  • 別の選択肢として、Haskellストリームの変換はプログラミング言語が本当に優れていると言われています。Haskellの愛好家はParsec、文字列ストリームの自然な解析を可能にする素晴らしいパッケージについて話しているので、私はこの考えだけを検討しています。xsltよりもはるかに優れています。これはすでに良好です。私はHaskellを学んでいるだけなので、繰り返すだけです今のところ、それを使ってテキストを変換する方法は1つもありません

2

特に大規模で複雑なシェルスクリプトを使いたくない場合は、PHP、Perl、Pythonなどの実際のスクリプト言語を見て、このようなことをするほうがよいと思います。


2番目に、そのようなテキスト変更操作を実行する必要がある場合、Perlを取得します(ただし、PythonまたはRubyも同様に実行できます)。より良いあなたはめったに使わない専門的なプログラムよりもあなたも(ない100%が仕事に適していても)知っていることを定期的に、あまり使用されるツールを使用して(と遅かれ早かれれますソート何とか落ちます)。
フォンブランド2013年

2

なぜそうするのかわかりませんが、ここには2つのテンプレートがあります。1つは「データベース」で、もう1つは実際のテンプレートです。どちらもshtplで簡単に処理できます。(私の個人的なプロジェクトなので、あまり使われていませんが、実際にそのような問題を解決するために開発されました)

shtplを使用すると、次のようになります。

ファイル「構成」の内容:

template_main=main.txt
template_other=other.txt
text1=whatever
text2=blah

ファイル「データベース」の内容(区切り文字はタブ(\ 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"

first.txt、second.txt、third.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では、最初に、構成ファイルから生成された必要な「データベース」があります。2番目に、データベース内のすべてのtupelについて、最終的にInテンプレートからの対応するOutファイル。

注:空のデータ[123]のトラブルを読み取ります。したがって、このアプローチでは不可能です。

ですから、これがあなたのニーズに対して十分に単純であることを望んでください。

楽しんで!


1

私は最近、ジンジャのようなテンプレート構文を使用してそれを実現するオープンソースプロジェクトを公開しました。それはクッキーと呼ばれています。ここにデモがあります:

クッキーのデモ


1

tcat.shをチェックしてください。テンプレートファイルがあるとします。

hello ${name}

その後

$ export name=world # or load and export from a properties file.
$ ./tcat.sh template-file

出力:

hello world
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.