Heim  >  Fragen und Antworten  >  Hauptteil

vim multi-line Matching delete an den Anfang der Zeile

Problembeschreibung
Eine größere Datei muss verarbeitet und der Inhalt gelöscht werden, bevor die entsprechende Zeichenfolge in jeder Zeile gelöscht wird. Das Dateiinhaltsformat ist wie folgt:


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

Es wird erwartet, dass der Inhalt vor dem ersten Erscheinen des Segmentfehlers in jeder Zeile bis zum Zeilenanfang gelöscht werden kann. Die erwarteten Verarbeitungsergebnisse sind wie folgt:


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

Die aktuelle Lösungverwendet Makros zur Ausführung

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

Nachteile: geringe Effizienz, extrem zeitaufwändig

Erwartete LösungErwarten Sie eine direkte Spaltenbearbeitung (Strg + V), um die übereinstimmende Position jeder Zeile am Anfang der Zeile zu löschen.
Wie erreicht man es?

ringa_leeringa_lee2712 Tage vor598

Antworte allen(3)Ich werde antworten

  • 曾经蜡笔没有小新

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

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

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

    Antwort
    0
  • 仅有的幸福

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

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

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

    \ze 标记匹配模式结束

    Antwort
    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也不行)

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

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

    Antwort
    0
  • StornierenAntwort