首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >vim过滤器/删除一行

vim过滤器/删除一行
EN

Stack Overflow用户
提问于 2015-01-02 17:06:49
回答 1查看 297关注 0票数 0

我们有一个tyfoons.txt文件,其中包含过去实际台风的几个信息属性。文件中的一行如下:

代码语言:javascript
复制
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

现在我要过滤掉两个不同年份的台风,就像上面提到的1977年和1978年的台风。我们认为台风的存在时间不会超过30天。

我如何从文件中过滤出这些行?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-02 17:54:58

使用:g命令可以实现一个简单的解决方案(只检查是否跨越了一年)。

例如,删除开始和结束时没有相同年份的任何行

代码语言:javascript
复制
: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天内)可能更好的方法是编写一个函数,将相关数据从行中分离出来,并进行必要的计算。一个基本的骨架是:

代码语言:javascript
复制
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的任何行,都是对最初的“不同年份”示例的轻微更改。

代码语言:javascript
复制
:g/\d\{4}−12−\d\d \d\d:\d\d − \d\{4}−01−\d\d \d\d:\d\d$/d
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27745757

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档