在 Vi-editor 中如何查找和更改特定日期的日期格式?

In Vi-editor How do I find and change date format of a specific date?

我的数据看起来像这样(在 vi-editor 中打开的文件中有 2 条记录)-

445544|2016-02-09|026|111|W108576|1|2015-02-13|2017-02-17|WHI|2016-02-10|SC|RN

114433|2016-02-07|046|366|WR71X253|4|2016-02-09|2017-02-17|GE|2016-02-08|SC|RN

我想将最后一个日期值的日期格式从 YYYY-mm-dd 更改为 mm-dd-YYYY 即

'2016-02-10' to '02-10-2016' & 
'2016-02-08' to '02-08-2016'

以下是我试过的

^.*\(\<[0-9]{4}\>\)-\(\<[0-9]{2}\>\)-\(\<[0-9\]{2}\>\)|\w\+|\w\+\n$

它说 - E486:未找到模式:

我知道一旦有了查找模式我就可以做 -

:STARTLINE,ENDLINEs/<PATTERN to find>/<PATTERN to replace>/g

请帮忙?

s/\v^([^|]+\|){9}\zs(\d{4})-(\d{2}-\d{2})/-/
  • \v很神奇,避免了太多\s
  • ^([^|]+\|){9}\zs 从行首开始,9 列由 | 分隔。通过使用 \zs,它后面的正则表达式将成为替换匹配的开始
  • (\d{4})-(\d{2}-\d{2}) 将 YYYY 和 MM-DD 捕获为两组
  • - re-arrange 根据需要

没有\zs

s/\v^(([^|]+\|){9})(\d{4})-(\d{2}-\d{2})/-/

您可以在正常模式下按此键更改单行:

T-Xdbf|i-<c-r>"<esc>

如果您想知道发生了什么,只需按下这些键,然后查看您的缓冲区中发生了什么变化。

将其应用于所有行:

马可

顺便说一句,在 vimgolf 中,宏通常会击败 :cmd :-)

qqT-Xdbf|i-<c-r>"<esc>+@qq

然后按 @q

注意,由于我使用了嵌套宏,请在录制宏之前做一个qqq,以便清除q中的旧内容。

普通命令

您也可以将那些普通命令包装到 :norm 中:

:%norm! T-Xdbf|i-^R"^[

,

  • ^R 上方,您按 ctrl-v ctrl-r
  • 你按的 ^[ ctrl-v ESC
%s/\(.*\|\)\(\d\{4\}\)-\(\d\{2\}\)-\(\d\{2\}\)/--/g
  • \(.*\|\) 贪婪地 匹配所有直到最后一个 | 也满足
  • \(\d\{4\}\)-\(\d\{2\}\)-\(\d\{2\}\) 匹配 YYYY-MM-DD

最短的正则表达式解决方案是使用 \zs\v 或者非常神奇,如果你 默认情况下启用它,并利用贪婪。如果 你匹配一个.*,一切都匹配。然后发动机返回 一步一步地尝试匹配剩下的匹配。这样日期 将是行中出现的最后一个日期,aways。

s/\v.*\zs(\d{4})-(\d\d-\d\d)/-