一个用bash(awk)写的代码产生器
转载时请注明出处和作者联系方式:http://blog.csdn.net/absurd
作者联系方式:Li XianJing <xianjimli at hotmail dot com>
更新时间:2007-1-3
在所有脚本语言中,我对bash情有独钟。原因是它简单易用,即使很久没有用过了,看看帮助马上就可以想起来。另外,它作为shell,自然对其它应用程序有较好的亲和力,特别是与find/grep/sed/awk等小工具组合起来,威力更是非同小可。
今天用bash写了一个代码产生器,类似的手法我至少用过数十次了,其简单但很实用,放在这里供新手参考吧。
需求简述:在http://www.iana.org/assignments/character-sets文档中,描述了各种charset的名称和ID。我需要从charset的名称查询到它的ID,或者从charset的ID查询到它的名称。
文档正文部分的格式类似于:
Name: BOCU-1 [Scherer] MIBenum: 1020 Source: http://www.unicode.org/notes/tn6/ Alias: csBOCU-1 Name: UTF-8 [RFC3629] MIBenum: 106 Source: RFC 3629 Alias: None |
从容易看出,我们只要把Name后面的内容和MIBenum后面的内容对应起来,生成一张表就行了,然后通过查表来完成ID和名称之间的转换。为了便于引用ID,我们还要定义一组枚举值。
脚本如下:
1 #!/bin/bash 2 grep "Name:/|MIBenum:" character-sets | awk ' 3 4 BEGIN{ 5 key=""; 6 print "#ifndef MIB_CHARSET_H" 7 print "#define MIB_CHARSET_H" 8 print "#define CHARSET_LIST //" 9 } 10 11 /Name/{ 12 key=$2; 13 } 14 15 /MIBenum/{ 16 printf " CHARSET_DEF(CHARSET_" 17 system("echo -n /"" key "/" |tr /"a-z/" /"A-Z/"|tr /"().://-/" /"_/""); 18 print ", /"" key "/", " $2 ")//"; 19 } 20 21 END{ 22 print "" 23 print "#undef CHARSET_DEF" 24 print "#define CHARSET_DEF(id, name, value) id=value," 25 print "enum {CHARSET_LIST};" 26 print "#undef CHARSET_DEF" 27 28 print "" 29 print "int mib_charset_name_to_id(const char* name);" 30 print "const char* mib_charset_id_to_name(int id);" 31 print "" 32 print "#endif/*MIB_CHARSET_H*/" 33 } 34 ' |
程序很简单:
行2: 用grep过滤出包含Name和MIBenum的内容。
行11-13: 保存Name的内容。
行15-19: 产生CHARSET_DEF。
行24-26: 产生枚举定义。
行29-30:产生函数原型。
关于CHARSET_DEF可以参考:神奇的xx宏
~~end~~