4 Stimmen

Wie suche ich nach dem N-ten Treffer in einer Zeile in Vim?

Ich bearbeite eine Wiki-Datei und möchte eine neue Spalte zwischen zwei vorhandenen Spalten hinzufügen.

| *No* | *Issue* | *File* | *Status* | 
| 1 | blah | foo | open |
| 2 | blah1 | foo1 | close |

Angenommen, ich möchte eine neue Spalte zwischen der 3. und 4. Spalte oben einfügen. Wenn ich nach dem vierten Treffer des |-Zeichens in einer bestimmten Zeile suchen könnte, könnte ich diesen durch | |ersetzen. Aber wie kann man das in Vim machen?

Das Endergebnis würde dann so aussehen:

| *No* | *Issue* | *File* | | *Status* | 
| 1 | blah | foo | | open |
| 2 | blah1 | foo1 | | close |

3voto

hochl Punkte 11724

Wie wäre es, ein Makro in das Register q aufzuzeichnen, indem Sie im Befehlsmodus qq3f|a|q eingeben (ESC bedeutet, die Escape-Taste zu drücken). Jetzt können Sie dieses Makro auf jede Zeile anwenden, indem Sie :%norm@q verwenden.

Zusätzlicher Bonus:

Mit diesem Muster können Sie komplexere Aktionen hinzufügen, zum Beispiel die erste Spalte als Spalte 3 replizieren (wenn der Cursor in der ersten Spalte steht):

qqf yf|;;;p0q

Ach ja, und die Antwort auf Ihre Frage: Die Suche nach dem 4. Auftreten von | in einer Zeile wird durch 3f| durchgeführt (wenn der Cursor sich in Position 0 befindet und auf einem |-Zeichen wie in Ihrem Beispiel).

2voto

ib. Punkte 26240

Betrachten Sie den folgenden Substitutionsbefehl.

:%s/\%(.\{-}|\)\{4}\zs/ |/

2voto

pooroldpedro Punkte 161
:%s/\(|[^|]*\)\{3\}/&| /

Was bedeutet: Bei jeder Zeile (%) die drei Vorkommen (\{3\}) einer Zeichenfolge finden, die mit | beginnt, gefolgt von einer beliebigen Anzahl von Nicht-| ([^|]*), und diese durch sich selbst ersetzen (&) gefolgt von |.

-1voto

kev Punkte 145226

Sie können sed in vim als Filter aufrufen:

:%!sed 's/|/| |/4'

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X