从模板创建文本文件的工具

从模板创建文本文件的工具

我必须定期从模板创建 100 多个文本文件。
我目前使用的 shell 脚本过于复杂。我认为有一个更聪明的方法来处理这个问题,但我不知道如何做。

我有一个“数据库”:

# 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%%(占位符形式可以更改)。

有人知道有什么工具可以比使用复杂的 shell 脚本更好地实现自动化吗?

答案1

您还可以考虑:

  • GNU 工具,m4它是一个文本处理器,可以输出您想要的文本,并将其作为输入模板,其中包含要更改的部分。它肯定比 shell 脚本更简单。 (它的工作方式更像是带有 #define 宏 IIRC 的 C 预处理器)。

  • xsltproc应用转换并给出输出的GNU 工具。模板位于 中xmlxslt是对您要进行的转换xml以输出文本的格式。

就我个人而言,我更喜欢xslt,但就您而言,它不适合表单中的字段 %DATA1% %DATA2%。它需要 xml,所以您不想更改模板。

因此你真的应该看看m4

  • 作为另一种选择,我被告知Haskell编程语言非常擅长转换流。我只是考虑这个想法,因为 Haskell 爱好者谈论了这个奇妙的Parsec包,它允许自然解析字符串流。比xslt好多了,已经很好了。我只是重复它们,因为我刚刚学习 Haskell,目前我不知道如何用它来转换文本

答案2

可能有数千种这样的模板语言和相关软件。一个流行的例子是欧洲研究局,它是 vanilla Ruby 的一部分。安装 Ruby 后,您可以启动irb编辑器并简单地粘贴规范示例来感受一下:

require 'erb'

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

答案3

我不知道你为什么这样做,但你这里有两个模板。一种是您的“数据库”,一种是您的真实模板。两者都很容易处理stpl。 (我的私人项目,所以没有广泛使用,但实际上是为了解决这类问题而开发的)

使用 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"

生成我们第一个.txt、第二个.txt 和第三个.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 的模板语法来实现这一点。它被称为曲奇饼。这是一个演示:

饼干演示

相关内容