Blog信息 |
blog名称: 日志总数:1304 评论数量:2242 留言数量:5 访问次数:7592520 建立时间: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~~ |
|
|