Löschen Sie eine bestimmte Spalte in VIM / gvim, ohne den Visual Block-Modus zu verwenden

8

Beispiel Eingabedatei

%Vor%

Es ist erforderlich, die S1-Spalte zu entfernen, d. h.

Gewünschte Ausgabe

%Vor%

Kann jemand dabei helfen

Danke

    
user1228191 09.05.2012, 11:07
quelle

5 Antworten

3

Im Befehlsmodus:

%Vor%

Dies verwendet den integrierten Befehl sed-like search and replace von vim. Hier ist die Aufschlüsselung:

% - für die gesamte Datei

s - Suche nach

/^ - der Anfang der Zeile

\([[+|][^+|]\+\) - gefolgt von + oder | , gefolgt von einer beliebigen Zahl ( \+ ) von allem, was nicht + oder | ist. Dadurch erhalten Sie die erste Spalte, die wir behalten möchten. Legen Sie sie also in eine Erfassungsgruppe, indem Sie sie mit \( und \)

umgeben

[+|][^+|]\+ - gefolgt von + oder | , gefolgt von einer beliebigen Zahl ( \+ ) von allem, was nicht + oder | ist. Das wird die zweite Spalte bekommen, die wir nicht behalten wollen, also keine Capture-Gruppe.

// - Ersetzen Sie alles, was wir gefunden haben, mit der ersten Erfassungsgruppe (die die erste Spalte enthält). Dies ersetzt effektiv die erste und zweite Spalte durch den Inhalt der ersten Spalte.

Wie ich schon sagte, sind die Regex von vim ziemlich identisch mit sed. Wenn Sie also dieses Tutorial auf sed Sie werden wahrscheinlich auch eine Menge nützlicher Dinge für vim aufheben.

Bearbeiten

Als Reaktion auf die Anfrage des OP, diese allgemein dazu zu bringen, jede -Spalte zu löschen:

%Vor%

Der Index innerhalb von \{\} löscht nun die angegebene Spalte. Stellen Sie sich das wie einen Array-Index vor (d. H. Beginnt bei Null). So löscht \{0\} jetzt die erste Spalte, \{1\} löscht die zweite Spalte und so weiter.

    
Tim Pote 09.05.2012, 11:14
quelle
4

Schau, ma: nein visueller (Block-) Modus !

Mein pragmatischer Ansatz wäre: Nach Spaltenankern suchen ( -+- )

%Vor%

Jetzt ist die Spaltenlöschung so einfach wie

%Vor%

(löschen Sie blockweise bis zum nächsten Vorkommen des Spaltenankers vom Ende des Dokuments).

Arbeit erledigt.

Fantastische Optionen

Um mehrere Spalten zu berücksichtigen, möchten Sie genau angeben, welche Spalte

entspricht

Das braucht ein bisschen mehr Pep

0 f + <% Geben Sie
N Cv N t + > d

Um mehr über diese :exec '/\%' . col('.') . 'v\v[+|]' -Wege zum Auswählen einer virtuellen Spalte zu erfahren, siehe

sehe 09.05.2012 16:05
quelle
3

Ich möchte den Kommentar von Mathias Schwarz in eine Antwort schreiben, weil Visual Mode der natürliche Weg für die Aufgabe ist, obwohl es bereits eine akzeptierte Antwort gibt.

Angenommen, der Cursor befindet sich in

%Vor%

Verwenden Sie den normalen Befehl Strg-V 8jf+d , um die Spalte S1 auszuwählen und zu löschen. Erklärung:

  • Strg-V : Geben Sie den blockweisen visuellen Modus ein.
  • 8j : Achtel ist die Anzahl der Zeilen der Tabelle, sie setzt den Cursor in der gleichen Spalte, aber in der letzten Zeile.
  • f + : Bewegt den Cursor bis zum nächsten + -Zeichen.
  • d : visuelle Auswahl löschen.

Und das Ergebnis ist:

%Vor%     
Birei 09.05.2012 12:50
quelle
2

Wenn dies der einzige Inhalt der Datei ist, ist der einfachste Weg, dies zu verwenden:

%Vor%

Wenn in der Datei mehr Text vorhanden ist, wird das Zeilenintervall angegeben:

%Vor%

Dabei ist X und Y das Zeilenintervall, z. B .: 10,17normal 22|d32|

Wenn Sie mit dem normalen Befehl und mit | nicht vertraut sind "Bewegung" gibt es eine kurze Erklärung:

  1. Der Befehl normal führt die folgenden Befehle im Modus normal aus;
  2. Das | "motion" bewegt den Cursor zu einer bestimmten Spalte, so dass 22| den Cursor auf die 22. Spalte verschiebt;

Was :X,Ynormal 22|d32| tatsächlich tut, ist, den Cursor auf die 22. Spalte ( 22| ) zu setzen und alles ( d ) bis zur 32. Spalte ( 32| ) für jede Zeile zu löschen spezifiziert durch X und Y.

    
Magnun Leno 09.05.2012 17:08
quelle
0

Basierend auf Mustern Ihrer Tabelle kann dies in zwei einfachen Befehlen erreicht werden:

%Vor%

Wo 2 ist Ihre zu entfernende Spalte ( 1 entfernt 1., 3 - 3.).

Dies funktioniert wie folgt (für jede Zeile auf einmal):

  1. F ind das zweite entsprechende Zeichen der Spalte ( 2f+ oder 2f| ).
  2. D springt zurück zum nächsten f Zeichen der Spalte ( dF+ oder dF| ).

Hier ist der Befehlszeilen-Ansatz, der die zweite Spalte an Ort und Stelle entfernt:

%Vor%     
kenorb 18.10.2015 13:31
quelle

Tags und Links