Vim查找替换的高端用法

处理文本时,有这么一个需求:一个包含大量聊天记录的文本文件,有两列。一列是时间,一列是内容。大致如:

1319265479, 你好啊。
...

现要将第一列的Unix时间戳转换成”2011-10-22 14:37:59″这种形式。

我第一反应就是用Vim。但发现,每一行的时间戳都不一样,不能直接简单的查找替换。其次,使用sed来处理每行,使用某个程序来将时间戳转换成直观的时间。但据我查找,Linux下的date可以将时间戳转成直观的时间,但Mac OS X下的date却不能做到。再次,我只好回到Vim里,打算从文档看看查找替换时能不能支持函数来转换匹配的字符串,结果还真有。

因为这文件里的时间戳已经很有规律了,都是以131开头的,所以我就用简单的匹配来做了。

:%s/\(131\d+\),/\=strftime("%Y-%m-%d %H:%I:%S", submatch(1)) . ", "/g

下面简要解释下这个正则表达式。:表示进入Vim的命令模式,%s表示进行全局替换,\(131\d+\),表示匹配以逗号结尾的时间戳,\=strftime()表示将先执行函数strftime(),将返回的结果进行替换,submatch(1)表示将匹配的时间戳当作strftime()的参数,.”,”表示将strftime()的结果与”,”组合起来(.号表示连接两个字符串)。这个正则表达式应用在文首的例文,进行展开后的结果如下:

:%s/1319265479,/\=stftime("%Y-%m-%d %H:%I:%S", 1319265479).","/g
等同于:
:%s/1319265479,/2011-10-22 14:37:59,/g

关于这种用法,可以Vim中使用

:h sub-replace-\=

来查看相关文档。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注