regex - 使用 awk 进行字符串模式匹配

标签 regex linux bash awk gawk

(找不到更好的标题)

我正在尝试转换多行,如下所示:

#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/

相关文章:

regex - 带有多个参数的 pgrep -f

java - 正则表达式模式仅匹配 Java 中逗号之间的两个字符

regex - 如何在 AWK 的字段分隔符中使用抑扬符?

java - Linux 上的套接字性能

linux - Linux 中的精确 grep -f 命令

linux - Vim 增量搜索

mysql - SQL,当一​​列的值为 A 或 B 时查找条目

php - 如何仅替换捕获的组?

bash - 执行 bash 然后在 docker 中运行命令

linux - 这个shell脚本有什么作用?什么是标题复制和行复制?变量?