首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >查找所有出现的12位数字,并将其替换为在vim中向所有数字添加1000。

问查找所有出现的12位数字,并将其替换为在vim中向所有数字添加1000。
EN

Stack Overflow用户
提问于 2014-03-12 09:34:49
回答 1查看 102关注 0票数 0

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

日志文件中的时间戳格式

代码语言:javascript
复制
043000000000 (04 Hr 30 Min 00 Sec 000 Millisecond 000 Microsecond)

应该通过向其添加0530000000来替换它,使其成为

代码语言:javascript
复制
100000000000

我只是想把CET中所有出现的时间戳转换成IST,增加05 Hr 30分钟。

我有一个linux机器和一个vim编辑器。我已经了解到,这可以通过vim与一些数学运算.But i的子匹配来实现,但无法弄清楚如何做到这一点。

任何帮助都很感激。

普拉宾

EN

回答 1

Stack Overflow用户

发布于 2014-03-12 09:44:10

这其中的关键确实是:help sub-replace-expression

有一些挑战:

  • 由于匹配可能从一个0开始,Vim的自动字符串到数字转换将处理为八进制,而不是十进制数,因此需要使用基数为10的str2nr()进行显式转换。
  • 这些数字溢出Vim的32位整数。幸运的是,对于这种计算,您可以忽略较低的数字,而只关注前3:\d\{3}匹配这些数字。为了避免在其他地方出现错误的匹配,我使用^将模式锚定在行的开头,并断言(但不匹配)剩下的9位数与\ze\d\{9}匹配。

代码语言:javascript
复制
:%s/^\d\{3}\ze\d\{9}/\=str2nr(submatch(0),10) +57/

这假设一个简单的线性时间戳,如“秒自X”。如果这是一个非线性的HHMMSS-like格式,因为Vim没有内置的日期算术,那么您必须自己编写一个适当的日期加法函数:

代码语言:javascript
复制
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')/
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22347215

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档