vimfilter/delete一行
vim filter/delete a line
我们有一个tyfoons.txt文件,里面包含了过去真实台风的几个信息属性。文件中的一行如下:
Name-identification number- wind - duration - beginning date - ending date
----------------------------------------------------------------------------------
Mary ( North ) − 1977.21 − 945 − 12 Days 18 Hours − 1977−12−21 00:00 − 1978−01−02 18:00
现在我必须过滤掉跨越 2 个不同年份的台风,例如上面的例子是 1977 年和 1978 年。
我们认为台风存在的时间不会超过 30 天。
如何从文件中过滤出这些行?
可以使用 :g
命令实现一个简单的解决方案(仅检查是否跨年)。
例如,删除任何开始和结束年份不同的行
:g!/\(\d\{4}\)−\d\d−\d\d \d\d:\d\d − −\d\d−\d\d \d\d:\d\d$/d
此处的相关部分将第一个日期 (\(\d\{4\}\)
) 中匹配的年份重新用作第二个数据 (</code>) 中的年份。 <code>:g!/{pat}/{cmd}
对不匹配 {pat}
的每一行执行 {cmd}
,因此当年份不同时,:d
命令是 运行 并删除该行。
执行更复杂的检查(在 30 天内 window)可能会通过编写一个从行中分离相关数据并进行必要计算的函数来更好地实现。基本框架是:
function DeleteInvalidDateRanges()
" matchlist() returns a list of the entire string that matched and all matched groups
" so slicing the list to extract items 1-4 gives a list of [year, month, date, time]
let dateTime1 = matchlist(getline('.'), '\(\d\{4}\)−\(\d\d\)−\(\d\d\) \(\d\d:\d\d\)', 0, 1)[1:4]
let dateTime2 = matchlist(getline('.'), '\(\d\{4}\)−\(\d\d\)−\(\d\d\) \(\d\d:\d\d\)', 0, 2)[1:4]
if MoreThan30Days(dateTime1, dateTime2)
delete
endif
endfunction
:%call DeleteInvalidDateRanges()
有关 Vim 中脚本的更多信息,您可以查看 relevant part of the user guide。
简单地删除任何开始月份为 12 和结束月份为 01 的行是对初始 "different years" 示例的轻微更改。
:g/\d\{4}−12−\d\d \d\d:\d\d − \d\{4}−01−\d\d \d\d:\d\d$/d
我们有一个tyfoons.txt文件,里面包含了过去真实台风的几个信息属性。文件中的一行如下:
Name-identification number- wind - duration - beginning date - ending date
----------------------------------------------------------------------------------
Mary ( North ) − 1977.21 − 945 − 12 Days 18 Hours − 1977−12−21 00:00 − 1978−01−02 18:00
现在我必须过滤掉跨越 2 个不同年份的台风,例如上面的例子是 1977 年和 1978 年。 我们认为台风存在的时间不会超过 30 天。
如何从文件中过滤出这些行?
可以使用 :g
命令实现一个简单的解决方案(仅检查是否跨年)。
例如,删除任何开始和结束年份不同的行
:g!/\(\d\{4}\)−\d\d−\d\d \d\d:\d\d − −\d\d−\d\d \d\d:\d\d$/d
此处的相关部分将第一个日期 (\(\d\{4\}\)
) 中匹配的年份重新用作第二个数据 (</code>) 中的年份。 <code>:g!/{pat}/{cmd}
对不匹配 {pat}
的每一行执行 {cmd}
,因此当年份不同时,:d
命令是 运行 并删除该行。
执行更复杂的检查(在 30 天内 window)可能会通过编写一个从行中分离相关数据并进行必要计算的函数来更好地实现。基本框架是:
function DeleteInvalidDateRanges()
" matchlist() returns a list of the entire string that matched and all matched groups
" so slicing the list to extract items 1-4 gives a list of [year, month, date, time]
let dateTime1 = matchlist(getline('.'), '\(\d\{4}\)−\(\d\d\)−\(\d\d\) \(\d\d:\d\d\)', 0, 1)[1:4]
let dateTime2 = matchlist(getline('.'), '\(\d\{4}\)−\(\d\d\)−\(\d\d\) \(\d\d:\d\d\)', 0, 2)[1:4]
if MoreThan30Days(dateTime1, dateTime2)
delete
endif
endfunction
:%call DeleteInvalidDateRanges()
有关 Vim 中脚本的更多信息,您可以查看 relevant part of the user guide。
简单地删除任何开始月份为 12 和结束月份为 01 的行是对初始 "different years" 示例的轻微更改。
:g/\d\{4}−12−\d\d \d\d:\d\d − \d\{4}−01−\d\d \d\d:\d\d$/d