搜尋

首頁  >  問答  >  主體

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 天前654

全部回覆(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
  • 取消回覆