对于产品开发需要的情况下,我们通常会选择某些模板引擎生成一些文件,如 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 下工作。