首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >VIM复合查询

VIM复合查询
EN

Stack Overflow用户
提问于 2016-06-20 10:21:28
回答 3查看 80关注 0票数 1

我正在使用VIM编辑如下所示的csv文件:

代码语言:javascript
复制
A00,A01,A02...
A10,A11,A12...
A20,A21,A22...

我想删除每一行,从第二次出现的",“到结尾。所以我会被留下:

代码语言:javascript
复制
A00,A01
A10,A11
A20,A21

我在第二行尝试了v,在第一行,然后G选择所有行,然后D删除,直到结尾。问题是Aij的长度不一定是一样的,所以这是行不通的.

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-06-20 10:49:01

这里的normal命令很有用:

代码语言:javascript
复制
:%norm! 2f,D

就这么做。

如果你想打高尔夫球,你可以记录宏,或者使用x@='...'格式。但是我觉得这种方法比正则表达式对给定问题的解决略好一些。

票数 4
EN

Stack Overflow用户

发布于 2016-06-20 10:39:57

使用:substitute,它将比块视觉模式工作得更好:

代码语言:javascript
复制
:%s/\v^.{-},.{-}\zs,.*//

使用

  • \v到regex (非常神奇的模式) (:h /\v)
  • 与行开头匹配的^
  • .{-},:在任何事情上都不贪婪,直到.第一个逗号(:h /\{)
  • .{-}\zs,:在第二个逗号之前是相同的,但这次我们告诉您,匹配是从逗号开始的(\zs -> Zone Start -> :h /\zs)。
  • 然后我们将匹配(即从第二个逗号开始)替换为零。
票数 1
EN

Stack Overflow用户

发布于 2016-06-20 12:16:50

使用:s的另一种可能是,您可以轻松地控制要保持的字段数量(出现了2个字段):

代码语言:javascript
复制
:%s/\v^([^,]*\zs,){2}.*//

\zs包含在()组中,然后定义其相对于最后发现组的位置。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37920030

复制
相关文章

相似问题

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