我在Vim中编辑的一个文件中有这个列:
16128161321613616140# etc...
16128
16132
16136
16140
# etc...
字符串我想把它转换成这个列:
0x3f000x3f040x3f080x3f0c# etc...
0x3f00
0x3f04
0x3f08
0x3f0c
型我如何在Vim中做到这一点?
nmpmafwu1#
使用printf(类似于C的sprintf)和\=命令来处理替换:
printf
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
:help printf()
:help submatch()
:help sub-replace-special
:help :s
型
0dxa2lsx2#
另一种方式:
:rubydo $_ = '0x%x' % $_
字符串或者:
:perldo $_ = sprintf '0x%x', $_
型这是一个更少的输入,你避免了一个水平的引号/ shell转义,你会得到,如果你这样做,通过:!。你需要Perl / Ruby支持编译到您的Vim。
:!
de90aj5v3#
另一种方法,将其传递给awk
awk '{printf "0x%x\n",$1}' file
qybjjes14#
选择(视觉)包含数字的行块,然后:
:!perl -ne 'printf "0x\%x\n", $_'
vltsax255#
要将十进制转换为十六进制,请使用以下命令
:echo printf("%x", decimal)
字符串这将导致显示十进制的十六进制等效值。范例:
:echo printf("%x", 61444)
型显示f004(相当于61444)。这不会在文件中找到并替换61444。
rks48beu6#
您可以轻松地创建一个持久的Vim宏来实现此目的:
let @x='"yy:r! printf "= 0x\%x" $((^Ry))^MkJ$'
字符串应该注意的是,^R和^M是必须与C-q C-r和C-q RET一起输入的特殊字符。当您将其添加到.vimrc时,它定义了一个要与@x一起运行的宏。宏将当前选择复制到寄存器中,运行printf shell命令将数字转换为十六进制,并将结果插入同一行。使用$(( ... ))的好处是它利用了bash内置的算术计算功能,因此您可以选择0xdead + 0x1337并获得:0xdead + 0x1337 = 0xf1e4个要在完整的列上运行它,您可以创建一个宏,选择点处的数字,例如,使用viW并运行@x。然后,您可以选择所有行并使用norm @a在每行上运行宏,假设您的宏被保存为注册a。
^R
^M
C-q C-r
C-q RET
@x
$(( ... ))
0xdead + 0x1337
0xdead + 0x1337 = 0xf1e4
viW
norm @a
6条答案
按热度按时间nmpmafwu1#
使用
printf
(类似于C的sprintf
)和\=
命令来处理替换:字符串
详情:
:%s/\d\+/
:匹配任意行(:%
)上的一个或多个数字(\d\+
)并替换(s
)。\=
:对于每个匹配项,替换为以下表达式的结果:printf("0x%04x",
:使用格式"0x%04x"
生成一个字符串,它对应于文字0x
,后跟一个四位(或更多)十六进制数字,用零填充。submatch(0)
:完全匹配的结果(即数字)。有关详细信息,请参阅:
型
0dxa2lsx2#
另一种方式:
字符串
或者:
型
这是一个更少的输入,你避免了一个水平的引号/ shell转义,你会得到,如果你这样做,通过
:!
。你需要Perl / Ruby支持编译到您的Vim。de90aj5v3#
另一种方法,将其传递给awk
字符串
qybjjes14#
选择(视觉)包含数字的行块,然后:
字符串
vltsax255#
要将十进制转换为十六进制,请使用以下命令
字符串
这将导致显示十进制的十六进制等效值。
范例:
型
显示f004(相当于61444)。
这不会在文件中找到并替换61444。
rks48beu6#
您可以轻松地创建一个持久的Vim宏来实现此目的:
字符串
应该注意的是,
^R
和^M
是必须与C-q C-r
和C-q RET
一起输入的特殊字符。当您将其添加到.vimrc时,它定义了一个要与@x
一起运行的宏。宏将当前选择复制到寄存器中,运行printf shell命令将数字转换为十六进制,并将结果插入同一行。使用
$(( ... ))
的好处是它利用了bash内置的算术计算功能,因此您可以选择0xdead + 0x1337
并获得:0xdead + 0x1337 = 0xf1e4
个要在完整的列上运行它,您可以创建一个宏,选择点处的数字,例如,使用
viW
并运行@x
。然后,您可以选择所有行并使用norm @a
在每行上运行宏,假设您的宏被保存为注册a。