如何在VIM中将十进制数转换为十六进制数?
我在VIM中编辑的文件中有此列:如何在VIM中将十进制数转换为十六进制数?,vim,Vim,我在VIM中编辑的文件中有此列: 16128 16132 16136 16140 # etc... 我想把它转换成这个列: 0x3f00 0x3f04 0x3f08 0x3f0c # etc... 如何在VIM中执行此操作?另一种方法,将其传递给awk awk '{printf "0x%x\n",$1}' file 选择(可视)包含数字的行块,然后: :!perl -ne 'printf "0x\%x\n", $_' 使用printf(类似于C的sprintf)和\=命令来处理替换: :
16128
16132
16136
16140
# etc...
我想把它转换成这个列:
0x3f00
0x3f04
0x3f08
0x3f0c
# etc...
如何在VIM中执行此操作?另一种方法,将其传递给awk
awk '{printf "0x%x\n",$1}' file
选择(可视)包含数字的行块,然后:
:!perl -ne 'printf "0x\%x\n", $_'
使用printf
(类似于C的sprintf
)和\=
命令来处理替换:
:%s/\d\+/\=printf("0x%04x", submatch(0))
详情:
:匹配任何行(:%s/\d\+/
)上的一个或多个数字(:%
)并替换(\d\+
)s
:对于每个匹配,替换为以下表达式的结果:\=
:使用printf(“0x%04x”,
格式生成一个字符串,该格式对应于一个文本“0x%04x”
,后跟一个四位(或更多)十六进制数,并用零填充。0x
:完全匹配的结果(即数字)子匹配(0)
:help printf()
:help submatch()
:help sub-replace-special
:help :s
还有另一种方式:
:rubydo $_ = '0x%x' % $_
或:
这减少了键入的次数,并且避免了通过
:!
进行引用/shell转义。您需要在Vim中编译Perl/Ruby支持。要将十进制转换为十六进制,请使用以下命令
:echo printf("%x", decimal)
这将导致显示十六进制等效的十进制
例如:
:echo printf("%x", 61444)
显示f004(相当于61444)
这不会在文件中找到并替换61444。当Vim有一个内部printf时,为什么要使用perl?这比记住如何使用Vimscript容易,如果(像大多数人一样)您使用它的频率远远低于Perl和Ruby。工作正常,请注意,如果整数包含负值,则需要在搜索前适当地使用它
s/-\?\d\+/\=printf(“0x%08x”,子匹配(0))
,并根据需要删除额外的0xffff
s:例如对于32位的s/0xffffffff/0x
。
:echo printf("%x", 61444)