47

我正在调查一个主要是 UTF-8 文件,其中包含很多长行。但是,该文件不完全是文本文件,有一些垃圾。为了找到我的兴趣点,我正在使用hdand grep

所以在某些时候我知道它对例如 0000301a 感兴趣,所以我想在 Vim 中快速打开文件并跳转到那个位置。

示例(实际上是一个小文件,这里的位置是 0000001c):

me@here:~$ hd file | grep -C 10 \ 00\ 
00000000  6c 69 6e 65 31 0a 6c 69  6e 65 32 0a 6c 69 6e 65  |line1.line2.line|
00000010  33 0a 6c 69 6e 65 34 0a  6c 69 6e 65 00 35 0a 6c  |3.line4.line.5.l|
00000020  69 6e 65 36 0a 6c 69 6e  65 37 0a 6c 69 6e 65 38  |ine6.line7.line8|
00000030  0a 6c 69 6e 65 39 0a 6c  69 6e 65 31 30 0a        |.line9.line10.|
0000003e
me@here:~$ 

Vim 中是否有跳转到字节位置的技巧?还是尽可能接近?

4

3 回答 3

68

就在这里。这是普通模式命令go

来自:h go

[count]go         转到缓冲区中的 {count} 个字节。

例如,42go跳转到字节 42。

为了跳转到十六进制或八进制地址,您需要使用:normal! goor 等​​价物:gotostr2nr()orprintf()函数构造命令。

:exe 'normal! ' . str2nr('0x2a', 16) . 'go'
:exe 'goto' str2nr('0x2a', 16)
于 2013-08-14T17:56:20.073 回答
5

虽然这个问题有其自身的优点,但我是否可以建议您以一种相当迂回的方式来做这件事,使用所有的hd, grep, Vim 和 shell?

为什么不使用 Vim 而整个过程只使用 Vim?

关键在于:h 23.4,“二进制文件”:Vim 可以成为你的十六进制编辑器。

使用您的文件启动 Vim 后vim -b myfile,工作流程变为:

:%!xxd -g1<Enter>
/00 <Enter>
...
...
:%!xxd -r<Enter>

也请务必阅读:h hex-editing以获取更多详细信息。

于 2013-08-14T20:38:08.630 回答
3

是的,使用:help starting.txt你可以找到关于所有 vim 命令行参数的帮助。

使用其他几个人给出的上述 goto 命令,您应该能够从命令行给 vim 一个命令以转到字节偏移量,例如

vim "+exe 'goto' str2nr('0x2a', 16)" file

:help +byte_offset您可以检查是否使用该:ve命令描述了一个编译时间标志。我的 Ubuntu 版本默认编译了它。

于 2013-08-14T18:33:41.347 回答