我正在使用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不一定长度相同,所以不起作用......
答案 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
包含在()
组中,然后其位置相对于最后找到的组进行定义。