VIM复杂查询

时间:2016-06-20 10:21:28

标签: regex csv vim

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

<form class="simple_form vertical_form"
      data-type="json" id="my_form"
      action="url_to_post"
      accept-charset="utf8"
      data-remote="true"
      method="post">
  <div class="field">
    <uib-timepicker
      name="my_time"
      ng-model="event.my_model"
      hour-step="1"
      minute-step="15"
      show-meridian="true">
    </uib-timepicker>
  </div>
  <div>
    <input type="submit" value="Validate" class="btn btn-success">
  </div>
</form>

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

A00,A01,A02...
A10,A11,A12...
A20,A21,A22...

我在第一行的第二个“,”上尝试了Ctrl-Shift-v,然后G选择所有行,然后D删除直到结束。问题是Aij不一定长度相同,所以不起作用......

3 个答案:

答案 0 :(得分:4)

这里的

normal命令很有帮助:

:%norm! 2f,D

做到了。

如果您想稍微打高尔夫球,可以录制宏,或使用x@='...'格式。但我觉得这种方式比给定问题的正则表达式解决方案略胜一筹。

答案 1 :(得分:1)

使用:substitute,它比块视觉模式效果更好:

:%s/\v^.{-},.{-}\zs,.*//

  • \v简单地使用正则表达式(非常神奇的模式)(:h /\v
  • ^匹配行的开头
  • .{-},:对任何事情进行非贪婪的匹配,直到...第一个逗号(:h /\{
  • .{-}\zs,:直到第二个逗号相同的内容,除了这次我们告诉匹配从逗号开始(\zs - &gt;区域开始 - &gt; :h /\zs)。
  • 然后我们用什么都替换匹配(即从第二个逗号开始)。

答案 2 :(得分:1)

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

:%s/\v^([^,]*\zs,){2}.*//

\zs包含在()组中,然后其位置相对于最后找到的组进行定义。