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


9

我必须定期从模板创建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脚本更好地实现此目的吗?


很难判断什么是复杂的。发布其中之一将有助于我们了解情况。也许尝试php或perl脚本?其中有更强大/更轻松的方式来处理字符串。
萧晨


Answers:


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,它是一个文本处理器,用于输出您要输入的文本作为模板,其中包含要更改的部分。它肯定比shell脚本简单。(它的工作方式与带有#define宏IIRC的C预处理器差不多)。

  • xsltproc应用转换并提供输出的GNU工具。模板位于中xmlxslt是要进行的转换操作的格式,xml以便输出文本。

我个人比较喜欢xslt,但是在您的情况下,尽管它不适合表单中的字段 %DATA1% %DATA2%。它需要xml,因此您不希望更改模板。

因此,您应该真正看看m4

  • 作为另一个选择,有人告诉我Haskell编程语言确实非常擅长转换流。我之所以只考虑这个想法,是因为Haskell爱好者谈论了一个奇妙的Parsec程序包,该程序包允许对字符串流进行自然解析。比xslt更好,后者已经很好。我只重复一遍,因为我只是在学习Haskell,目前我还没有一个唯一的想法如何使用它来转换文本

2

我认为您最好查看一种真正的脚本语言,例如PHP,Perl或Python,以便为您做这样的事情,特别是如果您确实不想进入大规模复杂的shell脚本时。


其次,当我不得不执行此类文本整理操作时,我抓住了Perl(但是Python或Ruby应该做得同样好)。与您很少使用的专用程序(或早或晚以某种方式归类)相比,最好使用您熟知的常规工具(即使不是100%适合该工作)。
vonbrand 2013年

2

我不知道为什么要这么做,但是这里有两个模板。一个是您的“数据库”,另一个是您的实际模板。两者都很容易用shtpl处理。(我的私人项目,因此未得到广泛使用,但实际上是为解决这类问题而开发的)

使用shtpl,您将执行以下操作:

文件“配置”的内容:

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

文件“数据库”的内容(我假设分隔符为tab(\ 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中,首先是从配置文件生成所需的“数据库”。其次,对于数据库中的每个Tupel,最后是In-template中对应的Out-file。

注意:空数据[123]会影响读取。因此,这种方法是不可能的。

因此,希望这对于您的需求足够简单。

玩得开心!



1

退房tcat.sh。假设您有一个模板文件:

hello ${name}

然后

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

输出:

hello world
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.