23

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

16128
16132
16136
16140
# etc...

我想将其转换为此列:

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

我怎样才能在 VIM 中做到这一点?

4

5 回答 5

45

使用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
于 2009-07-13T10:07:32.977 回答
6

还有一种方式:

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

或者:

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

这少了一点打字,并且您避免了如果您通过:!. 你需要编译到你的 Vim 中的 Perl / Ruby 支持。

于 2009-07-13T18:03:30.023 回答
5

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

awk '{printf "0x%x\n",$1}' file
于 2009-07-13T08:55:54.743 回答
5

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

:!perl -ne 'printf "0x\%x\n", $_'
于 2009-07-13T09:24:23.017 回答
1

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

:echo printf("%x", decimal)

这会导致显示与十进制等效的十六进制。

例子:

:echo printf("%x", 61444)

显示 f004(相当于 61444)。

这不会在文件中找到并替换 61444。

于 2015-07-24T04:19:47.087 回答