vim 多行匹配刪除至行首
ringa_lee
ringa_lee 2017-05-16 16:34:34
0
3
590

問題描述
需要對一個較大的檔案進行處理,刪除每一行中符合的字串之前的內容。文件內容格式如下:


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_lee
ringa_lee

ringa_lee

全部回覆(3)
曾经蜡笔没有小新

試試正規替換吧,列編輯,你的關鍵字位置不一樣,直接列編輯不了

:%s/^.*segmentfault/segmentfault/g
仅有的幸福

@ixx 思路是對的,正規表示式
不過有更簡單的方案

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

ze 標記匹配模式結束

淡淡烟草味

我猜問題作者是想使用vim的列模式(Ctrl-v)然後多行選擇,匹配選擇到segment單字之前的部分。
但是不行,因為做不到
1)列模式下匹配做得比較好的是到行首或者行尾,形成不規則的匹配塊;其他的位置不行。
2)第一行從行首到segment的s是3個W,而2行和3行到segment的s是2個W,這個不好一次性弄的。 (同理W換w也不行)

列模式下,比較適合處理的前提是,文字排列比較整齊或是能方便統一定位的

==========
另一個答案說的用正規表示式來匹配替換的很好用。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!