(找不到更好的标题)
我正在尝试转换多行,如下所示:
#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):
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)
....
我想到了这个:
gawk '/^#define/ && / [[:xdigit:]]/ { printf "%s((byte)%s)\n",$2,$3 }'
但是有两个问题——它不适用于 awk
;需要 GNU-awk (gawk
),而且我还需要在输出中提供行尾注释(只要可用)。我怎样才能做到这一点?我对使用 awk
特别感兴趣,但也可以使用 sed
。干杯!
最佳答案
您可以使用这个 awk 单行代码:
awk '$1=="#define" && $3~/[0-9]+$/{printf "%s((byte)%s)", $2, $3; $1=$2=$3=""; print}' file
编辑:这是一个 awk,您可以尝试更好地对齐评论:
awk '$1 == "#define" && $3 ~ /[0-9]+$/{s=sprintf("%s((byte)%s)", $2, $3); $1=$2=$3="";
printf("%-50s\t%s\n", s, $0)}'
输出:
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_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)
关于regex - 使用 awk 进行字符串模式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19587314/