我在VIM编辑的文件中有这个列:
16128
16132
16136
16140
# etc...
我想将其转换为此列:
0x3f00
0x3f04
0x3f08
0x3f0c
# etc...
如何在VIM中执行此操作?
答案 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。