如何在替换语句中将十六进制转换为十进制?

时间:2010-06-07 10:01:36

标签: vim

我有这样一句话:

  

pad(2)= 0x0041

我想将十六进制更改为十进制,预期结果为

  

pad(2)= 65

我刚试过:%s/\(.*\) = \(.*\)/\1 = \=printf("%d", submatch(2)),但失败了。

你能帮忙解决这个问题吗?

2 个答案:

答案 0 :(得分:10)

Vim有一个str2nr()函数可以将不同的数字表示转换为十进制值。要转换十六进制值,您可以像这样使用它:

s/0x[0-9a-fA-F]\+/\=str2nr(submatch(0), 16)

答案 1 :(得分:2)

您的代码几乎没问题,但是,根据文档:

  

当替换字符串以“\ =”开始时,余数被解释为   表达。这不起作用:里面有一个substitute()函数   表达式不能使用“\ =”作为替换字符串。

因此,您可以将代码更改为

%s/\(.*\) = \(.*\)/\=submatch(1)." = ".printf("%d", submatch(2))