J'étudie un fichier principalement UTF-8 avec beaucoup de longues lignes. Cependant, le fichier n'est pas entièrement un fichier texte, il y a des ordures. Pour trouver mon point d'intérêt, j'utilise hd
et grep
.
Donc, à un moment donné, je sais que cela m'intéresse, par exemple 0000301a, donc je veux ouvrir rapidement le fichier dans Vim et sauter à cette position.
Exemple (en fait un petit fichier, ici la position est 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:~$
Y a-t-il une astuce dans Vim pour passer à un position en octets? Ou le plus près possible?
Oui il y a. C'est la commande en mode normal go
.
De :h go
:
[count] go Aller à {count} octet dans le tampon.
Par exemple, 42go
Passe à l'octet 42.
Pour passer à une adresse hexadécimale ou octale, vous devez créer une commande avec :normal! go
Ou l'équivalent :goto
Et la fonction str2nr()
ou printf()
fonction.
:exe 'normal! ' . str2nr('0x2a', 16) . 'go'
:exe 'goto' str2nr('0x2a', 16)
Bien que cette question ait son propre mérite, puis-je suggérer que vous fassiez tout cela de manière plutôt détournée, en utilisant tous les hd
, grep
, Vim et le shell?
Pourquoi ne pas utiliser Vim et uniquement Vim pour l'ensemble du processus?
La clé est à :h 23.4
, "Fichiers binaires": Vim peut être votre éditeur hexadécimal.
Après avoir démarré Vim avec votre fichier, vim -b myfile
, le workflow devient:
:%!xxd -g1<Enter>
/00 <Enter>
...
...
:%!xxd -r<Enter>
N'oubliez pas de lire :h hex-editing
, aussi, pour plus de détails.
Oui, en utilisant :help starting.txt
, Vous pouvez trouver l'aide sur tous les arguments de ligne de commande vim.
En utilisant la commande goto ci-dessus donnée par plusieurs autres, vous devriez pouvoir donner à vim une commande à partir de la ligne de commande pour accéder au décalage d'octet, comme
vim "+exe 'goto' str2nr('0x2a', 16)" file
Il existe un indicateur de temps de compilation décrit dans :help +byte_offset
, Vous pouvez vérifier l'utilisation de la commande :ve
. Ma version Ubuntu l'a compilé par défaut.