2013-08-14 13 views
19

Sto esaminando un file UTF-8 principalmente con molte linee lunghe. Tuttavia, il file non è interamente file di testo, c'è un po 'di spazzatura. Per trovare il mio punto di interesse sto usando hd e grep.Salta all'indirizzo byte in vim?

Quindi ad un certo punto so che è interessato ad es. 0000301a, quindi voglio aprire rapidamente il file in Vim e saltare in quella posizione.

Esempio (in realtà un file molto piccolo, ecco la posizione è 0000001C):

[email protected]:~$ 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 
[email protected]:~$ 

C'è un trucco in Vim per passare a una posizione di byte ? O il più vicino possibile?

+0

Non so se questo funzionerà nel tuo caso, ma hai provato a convertire l'offset in decimale usando ': goto 1234'? –

+1

Non è necessario utilizzare la numerazione esadecimale a proposito, è possibile formattare l'output hd come desiderato. Dai un'occhiata alla pagina man. – glts

risposta

34

Sì, c'è. È il comando di modalità normale go.

Da :h go:

[count] Vai               Vai a {count} byte nel buffer.

Per esempio, 42go salti al byte 42.

Per passare a un esadecimale o un indirizzo ottale si avrebbe bisogno di costruire un comando con :normal! go o equivalente :goto, e la funzione str2nr() o printf().

:exe 'normal! ' . str2nr('0x2a', 16) . 'go' 
:exe 'goto' str2nr('0x2a', 16) 
+0

Risposte simili [qui] (http://stackoverflow.com/q/543738), a proposito. – glts

+3

Attenzione: le posizioni dei byte di Vim sono basate su 1 (come i numeri di colonna e di riga), non a base zero. – Oberon

3

Sì, utilizzando :help starting.txt è possibile trovare l'aiuto di tutti gli argomenti della riga di comando vim.

Utilizzando il comando goto sopra dato da molti altri si dovrebbe essere in grado di dare vim un comando dalla riga di comando per andare in offset di byte come

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

C'è una bandiera momento della compilazione descritto a :help +byte_offset è possibile verificare l'utilizzo del comando :ve. La mia versione di Ubuntu l'ha compilata per impostazione predefinita.

+1

'vim --version | grep byte_offset' e cercare '+' o '-' è generalmente più veloce di scansione': version' – FDinoff

+1

Anche se ': echo has (" byte_offset ")' è ancora più veloce. Basta controllare per vedere che l'output è un 1. – FDinoff

3

Mentre questa domanda ha il suo valore, posso suggerire che stai facendo tutto questo in un modo piuttosto indiretto, utilizzando tutto il hd, grep, Vim e la shell?

Perché non utilizzare Vim e solo Vim per l'intero processo?

Il codice è :h 23.4, "File binari": Vim può essere il tuo editor esadecimale.

Dopo aver avviato Vim con il file, vim -b myfile, il flusso di lavoro diventa:

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

Leggere attentamente :h hex-editing, troppo, per maggiori dettagli.