在 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)/-
我的数据看起来像这样(在 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)/-