利用 GAWK 实现模板文件替换

对于产品开发需要的情况下,我们通常会选择某些模板引擎生成一些文件,如 StringTemplate、Volecity,但是如果我们只是需要完成一些简单重复或者自动化的工作的话,依旧使用这样重量级的东西未免杀鸡用牛刀。

好在有个强大的 GNU AWK!
于是乎,花了一些时间来写了一个 awk 脚本,实现如下功能。 从 ini 文件读取键值,通过键名替换值。

其实就是一个简单的模板功能。

现在我们看一个简单的场景:
文件内容 Talk.tpl

1$(Famale) : Who are you!  
2$(Male_FirstName) : $(Male_FirstName), $(Male_FirstName) $(Male_LastName).

INI字典文件 Conf.ini

1Famale=Jane  
2Male_FirstName=James  
3Male_LastName=Bond

执行以下命令:

1gawk -f DictReplace.awk Conf.ini Talk.tpl > Talk.txt

则会生成文件 Talk.txt

1Jane : Who are you!  
2James : James, James Bond.

awk 脚本 DictReplace.awk

 1#!/usr/bin/gawk -f
 2#<code>
 3#<owner name="Zealic" email="[email protected]"/>
 4#<version>1.0</version>
 5#</code>
 6BEGIN {
 7fileCount = 0;
 8fullContent[0] = "";
 9fullLength = 0;
10}
11
12# MAIN  
13{
14# File flag
15if(FNR == 1)
16{
17  fileCount++;
18}
19# Load dict
20if(fileCount == 1 && $0 ~ /w+=.*/)
21{
22  len = length($0);
23  klen = index($0, "=") - 1;
24  key = substr($0, 0, klen);
25  value = substr($0, klen + 2, len);
26  repDict[key] = value;
27}
28else if(fileCount == 2)
29{
30  # Replace and store
31  outValue = $0;
32  for(dKey in repDict)
33  {
34    # Dynamic reglur exp
35    nowRegex = "\$\(" dKey "\)";
36    dValue = repDict[dKey];
37    gsub(nowRegex, dValue, outValue);
38  }
39  fullContent[fullLength] = outValue;
40  fullLength++;
41}
42}
43
44END {
45# Output result
46for(i=0;i<fullLength;i++)
47{
48  print(fullContent[i]);
49}
50}

上述脚本代码在 UnxUtils 的 gawk 下执行通过。
你可以直接在这里下载完整内容查看结果并获得 gawk.exe。

AWK 的动态构造正则真要命,搞了半天才发现,直接构造字符串就可以,然后直接放到参数中就可以作为正则使用,就是上面代码的蓝色部分。不过也基本学会 AWK,以后又有件利器可用啦。

稍后再测试能否在 Linux 下工作。

View Comments