利用 GAWK 实现模板文件替换

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值