如何在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)和\=命令来处理替换: :

我在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
)和
\=
命令来处理替换:

:%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)