2009-07-13 201 views

回答

38

使用printf(類似於C中的sprintf)用\=命令來處理替換:

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

詳細

  • :%s/\d\+/:上的任何線(:%)和替代(s)匹配的一個或多個數字(\d\+)。
  • \=:對於每個匹配,替換爲以下表達式的結果:
  • printf("0x%04x",:使用格式"0x%04x",其對應於字面0x後跟一個四位(或更多)的十六進制數產生一個字符串,軟墊與零。
  • submatch(0):完全匹配的結果(即數字)。

欲瞭解更多信息,請參見:

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

+1不錯(...和剩餘的15個字符) – stefanB 2009-07-21 01:53:37

+0

效果很好,請注意,如果您的整數包含負值,您將需要它在您的搜索前面適當地進行搜索s/- \?\ d \ +/\ = printf(「0x%08x」,submatch(0))`並根據需要刪除額外的'0xffff':例如`s/0xffffffff/0x`爲32位。 – Orwellophile 2017-09-24 04:41:11

5

另一種方式,通過它的awk

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

選擇(視頻)線包含數塊,然後:

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

爲什麼在Vim有內部printf時使用perl? – DrAl 2009-07-13 10:07:52

6

還有一種方法:

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

或者:

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

這是一個有點少打字和你避免水平如果你通過:!這樣做了,你會得到引用/ shell轉義。您需要將Perl/Ruby支持編譯到您的Vim中。

1

爲十進制轉換成十六進制,使用

:echo printf("%x", decimal) 

這導致十進制的十六進制等效正在顯示的命令。

實施例:

:echo printf("%x", 61444) 

F004(的61444當量)被顯示。

這不會在文件中找到並替換61444。

相關問題