我有一個文件,我編輯在VIM此列:如何在VIM中將十進制數轉換爲十六進制數?
16128
16132
16136
16140
# etc...
我想將它轉化成此列:
0x3f00
0x3f04
0x3f08
0x3f0c
# etc...
我怎樣才能做到這一點的VIM?
我有一個文件,我編輯在VIM此列:如何在VIM中將十進制數轉換爲十六進制數?
16128
16132
16136
16140
# etc...
我想將它轉化成此列:
0x3f00
0x3f04
0x3f08
0x3f0c
# etc...
我怎樣才能做到這一點的VIM?
使用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
另一種方式,通過它的awk
awk '{printf "0x%x\n",$1}' file
選擇(視頻)線包含數塊,然後:
:!perl -ne 'printf "0x\%x\n", $_'
爲什麼在Vim有內部printf時使用perl? – DrAl 2009-07-13 10:07:52
還有一種方法:
:rubydo $_ = '0x%x' % $_
或者:
:perldo $_ = sprintf '0x%x', $_
這是一個有點少打字和你避免水平如果你通過:!
這樣做了,你會得到引用/ shell轉義。您需要將Perl/Ruby支持編譯到您的Vim中。
爲十進制轉換成十六進制,使用
:echo printf("%x", decimal)
這導致十進制的十六進制等效正在顯示的命令。
實施例:
:echo printf("%x", 61444)
F004(的61444當量)被顯示。
這不會在文件中找到並替換61444。
+1不錯(...和剩餘的15個字符) – stefanB 2009-07-21 01:53:37
效果很好,請注意,如果您的整數包含負值,您將需要它在您的搜索前面適當地進行搜索s/- \?\ d \ +/\ = printf(「0x%08x」,submatch(0))`並根據需要刪除額外的'0xffff':例如`s/0xffffffff/0x`爲32位。 – Orwellophile 2017-09-24 04:41:11