[英]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 − \1−\d\d−\d\d \d\d:\d\d$/d
此处的相关部分正在重新使用第一个日期( \\(\\d\\{4\\}\\)
)中的匹配年份作为第二个数据( \\1
)中的年份。 :g!/{pat}/{cmd}
对不匹配{pat}
每一行执行{cmd}
,因此,当年份不同时,将运行:d
命令并删除该行。
通过编写一个将相关数据从生产线中分离出来并进行必要的计算的函数,可能会更好地执行更复杂的检查(在30天的窗口内)。 基本骨架为:
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中编写脚本的更多信息,请参见用户指南的相关部分 。
只需删除开始月份为12且结束月份为01的任何行,就与最初的“不同年份”示例略有不同。
:g/\d\{4}−12−\d\d \d\d:\d\d − \d\{4}−01−\d\d \d\d:\d\d$/d
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.