vim利用查找命令,将所有的十进制数字转化位十六进制数字
〇、前言
在做程序开发的时候,通常有些ID会由各种子ID按位数拼接而成,如下所示:
角色ID = 服务器ID左移16位 + 玩家下标 UserID = ServerID << 16 + UserIndex
如果此ID打印在日志里面,则显示为10进制,想匹配服务器ID相同的玩家则会比较困难。
这个时候就可以利用VIM丰富的函数,将服务器日志文件内的数字转为16进制,进而能够非常轻而易举的匹配相同服务器ID的玩家。
一、操作流程
1.用vim打开文件
[WARN | 2020-01-06 15:02:11,974] | UserID[655471] User Online. [WARN | 2020-01-06 15:02:11,974] | UserID[655415] User Offline. [WARN | 2020-01-06 15:02:11,974] | UserID[655471] Create User Success. [WARN | 2020-01-06 15:02:11,974] | UserID[659811] User Offline [WARN | 2020-01-06 15:02:11,974] | UserID[918509] User Offline [WARN | 2020-01-06 15:02:11,974] | UserID[720895] User Offline [WARN | 2020-01-06 15:02:11,974] | UserID[720897] User Offline
2.输入如下命令:
:%s/\d\+/\=printf("%X",submatch(0))/g
3.最终结果显示如下:
[WARN | 7E4-1-6 F:2:B,3CE] | UserID[A006F] User Online. [WARN | 7E4-1-6 F:2:B,3CE] | UserID[A0037] User Offline. [WARN | 7E4-1-6 F:2:B,3CE] | UserID[A006F] Create User Success. [WARN | 7E4-1-6 F:2:B,3CE] | UserID[A1163] User Offline [WARN | 7E4-1-6 F:2:B,3CE] | UserID[E03ED] User Offline [WARN | 7E4-1-6 F:2:B,3CE] | UserID[AFFFF] User Offline [WARN | 7E4-1-6 F:2:B,3CE] | UserID[B0001] User Offline
4.至此,则想找服务器ID为10(也就是16进制的A)的玩家就非常轻易了。
二、命令详解
1."\d\+":匹配一个或多个数字,vim help参考:":help \d"和":help \d"
2."printf":按照指定的格式输出,vim help参考:":help printf"
3."submatch":返回匹配文本的低N个,如果N为0,返回整个匹配文本。vim help参考:":help submatch"
所以以上命令:":%s/\d\+/\=printf("%X",submatch(0))/g" 可以做如下分解:
:%s / \d\+ / \=printf("%X",submatch(0)) / g 全局匹配 匹配数字 将匹配内容转换为16进制, 全部替换
即:将匹配到的数字转换为十六进制,全局匹配全部替换