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