我在 VIM 中编辑的文件中有此列:
16128
16132
16136
16140
# etc...
我想将其转换为此列:
0x3f00
0x3f04
0x3f08
0x3f0c
# etc...
我怎样才能在 VIM 中做到这一点?
我在 VIM 中编辑的文件中有此列:
16128
16132
16136
16140
# etc...
我想将其转换为此列:
0x3f00
0x3f04
0x3f08
0x3f0c
# etc...
我怎样才能在 VIM 中做到这一点?
使用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
还有一种方式:
:rubydo $_ = '0x%x' % $_
或者:
:perldo $_ = sprintf '0x%x', $_
这少了一点打字,并且您避免了如果您通过:!
. 你需要编译到你的 Vim 中的 Perl / Ruby 支持。
另一种方式,将其传递给 awk
awk '{printf "0x%x\n",$1}' file
选择(视觉)包含数字的行块,然后:
:!perl -ne 'printf "0x\%x\n", $_'
要将十进制转换为十六进制,请使用命令
:echo printf("%x", decimal)
这会导致显示与十进制等效的十六进制。
例子:
:echo printf("%x", 61444)
显示 f004(相当于 61444)。
这不会在文件中找到并替换 61444。