搜索

首页  >  问答  >  正文

vim 多行匹配删除至行首

问题描述
需要对一个较大的文件进行处理,删除每一行中匹配的字符串之前的内容。文件内容格式如下:


aaa dd kk segmentfault=1098-0987-3jlc ok=okj hello=0cvqa
12jk od=kk segmentfault=1jj8-lk87-oplc suiji=che shachu=keng
pppp=dd bbo;=9as segmentfault=0876-oj87-3pac zifu=ka neirong=xia

期望能够删除每行第一次出现 segmentfault 之前的内容至行首,期望处理的结果如下


segmentfault=1098-0987-3jlc ok=okj hello=0cvqa
segmentfault=1jj8-lk87-oplc suiji=che shachu=keng
segmentfault=0876-oj87-3pac zifu=ka neirong=xia

目前方案
使用宏来执行

qa    ---开启宏录制
/resourceId ---随意操作
d0               ---随意操作,删除至行首
j                  ---随意操作,跳转到下一行
q     ---退出宏
1000000@a ---执行1000000次

缺点:效率低下,极其耗时

期望方案
期望直接列编辑(ctrl + v)之后进行 删除每行匹配位置至行首 的操作。
该如何实现?

ringa_leeringa_lee2774 天前652

全部回复(3)我来回复

  • 曾经蜡笔没有小新

    曾经蜡笔没有小新2017-05-16 16:36:34

    试试正则替换吧,列编辑,你的关键字位置不一样,直接列编辑不了

    :%s/^.*segmentfault/segmentfault/g

    回复
    0
  • 仅有的幸福

    仅有的幸福2017-05-16 16:36:34

    @ixx 思路是对的,正则表达式
    不过有更简单的方案

    :%s/^.*\zesegmentfault//g

    ze 标记匹配模式结束

    回复
    0
  • 淡淡烟草味

    淡淡烟草味2017-05-16 16:36:34

    我猜测问题作者是想使用vim的列模式(Ctrl-v)然后多行选择,匹配选择到segment单词之前的部分。
    但是不行,因为做不到
    1)列模式下匹配做得比较好的是到行首或者行尾,形成不规则的匹配块;其他的位置不行。
    2)第一行从行首到segment的s是3个W,而2行和3行到segment的s是2个W,这个不好一次性弄的。(同理W换w也不行)

    列模式下,比较适合处理的前提是,文字排列比较整齐或者能方便统一定位的

    ==========
    另一个答案说的用正则表达式来匹配替换的很好用。

    回复
    0
  • 取消回复