用awk字符串pattaren匹配 [英] string pattaren-matching using awk

查看:201
本文介绍了用awk字符串pattaren匹配的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

(不能附带任何更好的标题)

(Couldn't come with any better title)

我想转换的行数,像这样的:

I'm trying to convert a number of lines, like these:

#define GENERIC_TYPE_METER_PULSE                     0x30 /*Pulse Meter*/
#define SPECIFIC_TYPE_NOT_USED                       0x00 /*Specific Device Class not used*/
......
#define MFG_ID_WAYNE_DALTON                          0x0008   //Wayne Dalton
#define MFG_ID_WILSHINE_HOLDING_CO_LTD               0x012D   //Wilshine Holding Co., Ltd
#define MFG_ID_WIDOM                                 0x0149   //wiDom
......
#define COMMAND_CLASS_ALARM                              0x71
#define COMMAND_CLASS_ALARM_V2                           0x71
#define COMMAND_CLASS_NOTIFICATION_V3                    0x71
#define COMMAND_CLASS_NOTIFICATION_V4                    0x71

在一个文件中(C ++),以类似这些(用于Java):

in a file (c++) to something like these (for Java):

SPECIFIC_TYPE_NOT_USED((byte)0x00)             /*Specific Device Class not used*/
MFG_ID_WILSHINE_HOLDING_CO_LTD((byte)0x012D)   //Wilshine Holding Co., Ltd
COMMAND_CLASS_ALARM((byte)0x71)
....

我想出了这一点:

I came up with this:

gawk '/^#define/ && / [[:xdigit:]]/ { printf "%s((byte)%s)\n",$2,$3 }'

但有两个问题 - 它不会与 AWK 工作;需要GNU-AWK( GAWK ),我还需要在输出中结束的行注释可用时。我该怎么办呢?我用特别感兴趣 AWK 但可以用 SED 生活为好。干杯!!

but there are two issues - it doesn't work with awk; requires GNU-awk (gawk) and I also need the end-of-the-line comments in the output whenever available. How can I do that? I'm especially interested using awk but can live with sed as well. Cheers!!

推荐答案

有一个 SED 的解决方案,我只是测试一次,所以第一次测试有些情况下

one sed solution, i just tested once, so first test some cases

[[bash_prompt$]]$ cat log; echo "########";sed -e 's/#define \([^ ]*\)[ ]*\([^ ]*\)/\1((byte)\2)/g' log
#define GENERIC_TYPE_METER_PULSE                     0x30 /*Pulse Meter*/
#define SPECIFIC_TYPE_NOT_USED                       0x00 /*Specific Device Class not used*/
#define MFG_ID_WAYNE_DALTON                          0x0008   //Wayne Dalton
#define MFG_ID_WILSHINE_HOLDING_CO_LTD               0x012D   //Wilshine Holding Co., Ltd
#define MFG_ID_WIDOM                                 0x0149   //wiDom
#define COMMAND_CLASS_ALARM                              0x71
#define COMMAND_CLASS_ALARM_V2                           0x71
#define COMMAND_CLASS_NOTIFICATION_V3                    0x71
#define COMMAND_CLASS_NOTIFICATION_V4                    0x71
########
GENERIC_TYPE_METER_PULSE((byte)0x30) /*Pulse Meter*/
SPECIFIC_TYPE_NOT_USED((byte)0x00) /*Specific Device Class not used*/
MFG_ID_WAYNE_DALTON((byte)0x0008)   //Wayne Dalton
MFG_ID_WILSHINE_HOLDING_CO_LTD((byte)0x012D)   //Wilshine Holding Co., Ltd
MFG_ID_WIDOM((byte)0x0149)   //wiDom
COMMAND_CLASS_ALARM((byte)0x71)
COMMAND_CLASS_ALARM_V2((byte)0x71)
COMMAND_CLASS_NOTIFICATION_V3((byte)0x71)
COMMAND_CLASS_NOTIFICATION_V4((byte)0x71)
[[bash_prompt$]]$

一个适当的格式,(在我的感觉,这是调整的注释),我没能拿出任何 SED 解决方案,(我很感兴趣一个)这里是一个 AWK 解决方案(貌似有点笨拙,但言自明。

for a proper format, ( in my sense, it is aligning the comment ) , i was not able to come up with any sed solution, ( i am interested in one ) here is an awk solution ( looks like a little clumsy, but self explanatory..

[[bash_prompt$]]$ awk '{str=sprintf("%s((byte)%s)", $2, $3);len=length(str); \
> for(i=50;i>len;i--) str=sprintf("%s ", str); print str (NF>3?substr($0,index($0,$4)):"")}' log
GENERIC_TYPE_METER_PULSE((byte)0x30)              /*Pulse Meter*/
SPECIFIC_TYPE_NOT_USED((byte)0x00)                /*Specific Device Class not used*/
MFG_ID_WAYNE_DALTON((byte)0x0008)                 //Wayne Dalton
MFG_ID_WILSHINE_HOLDING_CO_LTD((byte)0x012D)      //Wilshine Holding Co., Ltd
MFG_ID_WIDOM((byte)0x0149)                        //wiDom
COMMAND_CLASS_ALARM((byte)0x71)
COMMAND_CLASS_ALARM_V2((byte)0x71)
COMMAND_CLASS_NOTIFICATION_V3((byte)0x71)
COMMAND_CLASS_NOTIFICATION_V4((byte)0x71)

这篇关于用awk字符串pattaren匹配的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆