我有一个这样的线:如何在替代语句中将十六进制转换为十进制?
垫(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