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

posted on 2008-03-28 04:09  Zealic  阅读(1024)  评论(1编辑  收藏  举报