利用 GAWK 实现模板文件替换

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

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

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

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

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

INI字典文件 Conf.ini

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

执行以下命令:
gawk -f DictReplace.awk Conf.ini Talk.tpl > Talk.txt

则会生成文件 Talk.txt

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

awk 脚本 DictReplace.awk

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#!/usr/bin/gawk -f
#<code>
#<owner name="Zealic" email="rszealic@gmail.com"/>
#<version>1.0</version>
#</code>
BEGIN {
fileCount = 0;
fullContent[0] = "";
fullLength = 0;
}

# MAIN  
{
# File flag
if(FNR == 1)
{
  fileCount++;
}
# Load dict
if(fileCount == 1 && $0 ~ /w+=.*/)
{
  len = length($0);
  klen = index($0, "=") - 1;
  key = substr($0, 0, klen);
  value = substr($0, klen + 2, len);
  repDict[key] = value;
}
else if(fileCount == 2)
{
  # Replace and store
  outValue = $0;
  for(dKey in repDict)
  {
    # Dynamic reglur exp
    nowRegex = "\$\(" dKey "\)";
    dValue = repDict[dKey];
    gsub(nowRegex, dValue, outValue);
  }
  fullContent[fullLength] = outValue;
  fullLength++;
}
}

END {
# Output result
for(i=0;i<fullLength;i++)
{
  print(fullContent[i]);
}
}

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

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

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

Zealic @ 2008-03-28

View Comments |
Categories: tech.posix
Tags:

Related posts