找到12位数字的所有出现,并替换为在vim中为所有这些数字添加1000

时间:2014-03-12 09:34:49

标签: regex vim replace

我有一个日志文件,其中包含微秒格式的时间戳。我想用其他时区替换时间戳。

日志文件中的时间戳格式

043000000000 (04 Hr 30 Min 00 Sec 000 Millisecond 000 Microsecond)

应该替换为添加 0530000000 ,以便它成为

100000000000

我只是尝试通过添加05小时30分钟将CET中所有出现的时间戳转换为IST。

我有一台linux机器和一个vim编辑器。我已经知道这可以通过vim与子匹配进行一些数学运算来完成。但是我无法弄清楚如何做到这一点。

任何帮助表示感谢。

Prabin

1 个答案:

答案 0 :(得分:2)

关键是:help sub-replace-expression

存在一些挑战:

  • 由于匹配可能以0开头,因此Vim的自动字符串到数字转换会将其视为八进制,而不是十进制数字,因此需要使用基数为10的str2nr()进行显式转换。
  • 数字溢出Vim的32位整数。幸运的是,对于这个计算,你可以忽略较低的数字,并专注于前3:\d\{3}匹配那些。为避免在其他地方出现错误匹配,我将模式锚定到^行的开头,并使用\ze\d\{9}断言(但不匹配)其余9位数。
:%s/^\d\{3}\ze\d\{9}/\=str2nr(submatch(0),10) +57/

假定一个简单的线性时间戳,如“自X以来的秒数”。如果这是一种类似非线性HHMMSS的格式,因为Vim没有内置的日期算术,你必须自己编写一个正确的日期添加函数:

function! DateAdd( date, offset )
    " Split into hours and minutes, do the addition with overflow handling here...
    return addedDate
endfunction
:%s/^\d\{4}\ze\d\{8}/\=DateAdd(submatch(0), '0530')/