对于产品开发需要的情况下,我们通常会选择某些模板引擎生成一些文件,如 StringTemplate、Volecity,但是如果我们只是需要完成一些简单重复或者自动化的工作的话,依旧使用这样重量级的东西未免杀鸡用牛刀。
对于产品开发需要的情况下,我们通常会选择某些模板引擎生成一些文件,如 StringTemplate、Volecity,但是如果我们只是需要完成一些简单重复的工作的话,依旧使用这样重量级的东西未免杀鸡用牛刀。
好在有个强大的 GNU AWK!
于是乎,花了一些时间来写了一个 awk 脚本,实现如下功能。
从 ini 文件读取键值,通过键名替换值。
其实就是一个简单的模板功能。
现在我们看一个简单的场景:
文件内容 Talk.tpl:
$(Famale) : Who are you! $(Male_FirstName) : $(Male_FirstName), $(Male_FirstName) $(Male_LastName). |
INI字典文件 Conf.ini:
Famale=Jane Male_FirstName=James Male_LastName=Bond |
执行以下命令:
gawk -f DictReplace.awk Conf.ini Talk.tpl > Talk.txt |
则会生成文件 Talk.txt:
Jane : Who are you! James : James, James Bond. |
awk 脚本 DictReplace.awk:
#!/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 下工作。
2008-3-28