web-dev-qa-db-ja.com

vimでバイトアドレスにジャンプしますか?

多くの長い行を含む主にUTF-8ファイルを調査しています。ただし、ファイルは完全にテキストファイルではなく、ゴミがあります。興味のある場所を見つけるために、hdgrepを使用しています。

したがって、ある時点で、たとえば、 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でバイト位置にジャンプするトリックはありますか?または可能な限り近い?

38
Alois Mahdal

はいあります。これは通常モードのコマンドgoです。

から _:h go_

[count] goバッファの{count}バイトに移動します。

たとえば、_42go_はバイト42にジャンプします。

16進数または8進数のアドレスにジャンプするには、_:normal! go_または同等の_:goto_、およびstr2nr()またはprintf()関数を使用してコマンドを作成する必要があります。

_:exe 'normal! ' . str2nr('0x2a', 16) . 'go'
:exe 'goto' str2nr('0x2a', 16)
_
53
glts

この質問にはそれ自体のメリットがありますが、hdgrep、Vim、およびシェルのすべてを使用して、この全体をかなり遠回りの方法で行うことを提案できますか?

プロセス全体でVimとVimのみを使用しないのはなぜですか?

キーは :h 23.4 、「バイナリファイル」:Vimを16進エディタにできます。

ファイルでVimを起動した後、vim -b myfile、ワークフローは次のようになります。

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

必ずお読みください :h hex-editing についても詳しく説明します。

5
glts

はい、_:help starting.txt_を使用すると、すべてのvimコマンドライン引数に関するヘルプを見つけることができます。

他のいくつかの人から与えられた上記のgotoコマンドを使用すると、vimにコマンドラインからコマンドを与えて、次のようなバイトオフセットに移動できます。

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

_:help +byte_offset_で説明されているコンパイル時フラグがあり、_:ve_コマンドを使用して確認できます。私のUbuntuバージョンでは、デフォルトでコンパイルされています。

3
Grant Bowman