扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
在所有脚本语言中,我对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:产生函数原型。
查看本文来源
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者