我必须定期从模板创建 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 工具。模板位于 中xml
,xslt
是对您要进行的转换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 的模板语法来实现这一点。它被称为曲奇饼。这是一个演示: