我有一個這樣的線:如何在替代語句中將十六進制轉換爲十進制?
墊(2)= 0x0041
我想改變hex成十進制和預期的結果是
墊(2)= 65
我剛剛試過:%s/\(.*\) = \(.*\)/\1 = \=printf("%d", submatch(2))
,但失敗了。
你能幫忙解決嗎?
我有一個這樣的線:如何在替代語句中將十六進制轉換爲十進制?
墊(2)= 0x0041
我想改變hex成十進制和預期的結果是
墊(2)= 65
我剛剛試過:%s/\(.*\) = \(.*\)/\1 = \=printf("%d", submatch(2))
,但失敗了。
你能幫忙解決嗎?
Vim有一個str2nr()
函數可以將不同數字表示轉換爲它們的十進制值。要轉換的十六進制值,你可以使用這樣的:
s/0x[0-9a-fA-F]\+/\=str2nr(submatch(0), 16)
你的代碼幾乎是好的,但是,根據文檔:
當替代字符串開始以「\ =」的餘數被解釋爲 表達式。這不會遞歸地工作: 裏面的替代函數()函數表達式不能使用「\ =」作爲替代字符串。
所以,你可以更改您的代碼
%s/\(.*\) = \(.*\)/\=submatch(1)." = ".printf("%d", submatch(2))
嗨ZyX, 非常感謝。我會嘗試你的方法。現在我有一個很好的方法來轉換我的日誌。 :-) – stefanzweig 2010-06-08 12:48:16
如果你在上半部分沒有改變任何東西(只是匹配),你可能要考慮用'\ zs'來改變替換字符串的起始位置: – rampion 2010-06-08 13:28:52
'%s/pad(。* )= \ zs0x [0-9a-fA-F] \ +/\ = print(「%d」,submatch(2))' – rampion 2010-06-08 13:43:39
哦。非常感謝你,你的方法非常有用。 但是如果語句中有[a-f],則該方法失敗。 – stefanzweig 2010-06-07 10:51:17
@stefan:哎呀,當然是:),我應該延長比賽還包括那些字符... – sth 2010-06-07 11:07:59
非常感謝。它工作肯定。 – stefanzweig 2010-06-08 12:46:52