2009-07-13 8 views

Répondre

38

utilisation printf (analogue à C de sprintf) avec la commande \= pour gérer le remplacement:

:%s/\d\+/\=printf("0x%04x", submatch(0)) 

Détails:

  • :%s/\d\+/: apparier un ou plusieurs chiffres (\d\+) sur une ligne (:%) et de remplacement (s).
  • \=: pour chaque match, le remplacer par le résultat de l'expression suivante:
  • printf("0x%04x",: produire une chaîne de caractères en utilisant le format "0x%04x", ce qui correspond à un 0x littéral suivi d'un nombre hexadécimal à quatre chiffres (ou plus), rembourré avec des zéros.
  • submatch(0): Le résultat de la correspondance complète (c'est-à-dire le nombre).

Pour plus d'informations, voir:

:help printf() 
:help submatch() 
:help sub-replace-special 
:help :s 
+0

+1 gentil (... et les 15 caractères restants) – stefanB

+0

fonctionne bien, sachez que si vos nombres entiers contiennent des valeurs négatives, vous en aurez besoin avant votre recherche 's/- \? \ D \ +/\ = printf ("0x% 08x", submatch (0)) 'et supprime le 0xffff supplémentaire comme requis: par exemple' s/0xffffffff/0x' pour 32 bits. – Orwellophile

5

une autre manière, pour le transmettre à awk

awk '{printf "0x%x\n",$1}' file 
4

Select (VISUAL) du bloc de lignes qui contient les nombres, puis:

:!perl -ne 'printf "0x\%x\n", $_' 
+1

Pourquoi utiliser perl quand Vim a un printf interne? – DrAl

6

Encore une autre façon:

:rubydo $_ = '0x%x' % $_ 

Ou:

:perldo $_ = sprintf '0x%x', $_ 

C'est un peu moins de frappe et vous évitez un niveau de citant/shell échapper que vous auriez si vous avez fait cela via :! . Vous avez besoin du support Perl/Ruby compilé dans votre Vim.

+1

Et c'est plus facile que de se rappeler comment utiliser Vimscript, si (comme la plupart des gens) vous l'utilisez beaucoup moins souvent que Perl et Ruby. – ephemient

1

Pour convertir un nombre décimal en hexadécimal, utilisez la commande

:echo printf("%x", decimal) 

Il en résulte en hexadécimal équivalent de décimales affichée.

Exemple:

:echo printf("%x", 61444) 

F004 (équivalent de 61444) est affiché.

Ceci ne trouvera pas et ne remplacera pas 61444 dans le fichier.

Questions connexes