| 
 
| 
 
 
 
 
 
 
| Blog信息 |  
| blog名称:日志总数:1304
 评论数量:2242
 留言数量:5
 访问次数:7644908
 建立时间:2006年5月29日
 |   
 
 |  | 
 
|  [shell/bash]一个用bash(awk)写的代码产生器 软件技术
 lhwork 发表于 2007/1/4 22:04:13  |  
| 
| 转载时请注明出处和作者联系方式: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~~ |  
 |  
 
 
 
 |