如何在VIM中将十进制数转换为十六进制?

时间:2009-07-13 08:45:23

标签: vim

我在VIM编辑的文件中有这个列:

16128
16132
16136
16140
# etc...

我想将其转换为此列:

0x3f00
0x3f04
0x3f08
0x3f0c
# etc...

如何在VIM中执行此操作?

5 个答案:

答案 0 :(得分:38)

使用printf(类似于C的sprintf)和\=命令来处理替换:

:%s/\d\+/\=printf("0x%04x", submatch(0))

详细

  • :%s/\d\+/:在任意一行(\d\+)上匹配一个或多个数字(:%)并替换(s)。
  • \=:对于每个匹配,请替换为以下表达式的结果:
  • printf("0x%04x",:使用格式"0x%04x"生成一个字符串,该格式对应于文字0x,后跟四位(或更多)十六进制数字,用零填充。
  • submatch(0):完全匹配的结果(即数字)。

有关详细信息,请参阅:

:help printf()
:help submatch()
:help sub-replace-special
:help :s

答案 1 :(得分:6)

另一种方式:

:rubydo $_ = '0x%x' % $_

或者:

:perldo $_ = sprintf '0x%x', $_

如果您通过:!执行此操作,则可以减少打字/ shell转义。您需要将Perl / Ruby支持编译到您的Vim中。

答案 2 :(得分:5)

另一种方式,将其传递给awk

awk '{printf "0x%x\n",$1}' file

答案 3 :(得分:4)

选择(VISUAL)包含数字的行块,然后:

:!perl -ne 'printf "0x\%x\n", $_'

答案 4 :(得分:1)

要将小数转换为十六进制,请使用命令

:echo printf("%x", decimal)

这会导致十六进制等效于显示小数。

示例:

:echo printf("%x", 61444)
显示

f004(相当于61444)。

这将无法在文件中找到并替换61444。