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进制,             全部替换
即:将匹配到的数字转换为十六进制,全局匹配全部替换

 

posted @ 2020-01-07 10:19  溟漓  阅读(1157)  评论(0编辑  收藏  举报