47

長い行がたくさんある主にUTF-8ファイルを調査しています。ただし、ファイルは完全にテキスト ファイルではなく、いくつかのゴミがあります。興味のあるポイントを見つけるために、 と を使用hdして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 にジャンプします。

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

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

hdこの質問にはそれ自体のメリットがありますが、 、grep、Vim、およびシェルのすべてを使用して、この全体をかなり回りくどい方法で行っていることをお勧めしますか?

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

鍵は:h 23.4、「バイナリ ファイル」にあります。Vim を 16 進エディタとして使用できます。

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

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

:h hex-editing詳細については、 も必ずお読みください。

于 2013-08-14T20:38:08.630 に答える