2009-07-13 2 views

ответ

38

Использование printf (аналогично Кассиопеяне sprintf) с командой \= для замены:

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

Детали:

  • :%s/\d\+/: Матч один или несколько цифр (\d\+) в любой строке (:%) и подставим (s).
  • \=: для каждого матча, заменить с результатом следующего выражения:
  • printf("0x%04x",: произвести строку с использованием формата "0x%04x", что соответствует буквальному 0x, за которым следует четыре цифры (или более) шестнадцатеричное числом, проложенной с нулями.
  • submatch(0): Результат полного совпадения (т. Е. Число).

Для получения дополнительной информации см:

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

+1 nice (... и остальные 15 символов) – stefanB

+0

хорошо работает, имейте в виду, что если ваши целые числа содержат отрицательные значения, вам понадобится предисловие к вашему поиску соответственно 's/- \? \ D \ +/\ = printf («0x% 08x», отправить (0)) 'и удалить дополнительные' 0xffff 'по необходимости: например' s/0xffffffff/0x' для 32 бит. – Orwellophile

5

другой способ, чтобы передать его AWK

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

Select (VISUAL) блок строк, содержащий числа, а затем:

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

Зачем использовать perl, когда Vim имеет внутренний printf? – DrAl

6

Еще один способ:

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

Или:

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

Это немного меньше, типирование и избежать уровня цитирования/оболочки, которые вы получите, если вы сделали это через :! , Вам нужна поддержка Perl/Ruby, собранная в ваш Vim.

+1

И проще, чем вспомнить, как использовать Vimscript, если (как и большинство людей) вы используете его гораздо реже, чем Perl и Ruby. – ephemient

1

Чтобы преобразовать десятичное в шестнадцатеричное, используйте команду

:echo printf("%x", decimal) 

Это приводит в шестнадцатеричном эквивалент десятичного отображается. отображается

:echo printf("%x", 61444) 

F004 (эквивалент 61444):

Пример.

Это не находит и не заменяет 61444 в файле.