3 Stimmen

vim - alles zwischen Tabulatorzeichen löschen

Ich habe eine Datei mit tabulatorgetrennten Daten. Ich muss 2 Spalten löschen. Welche(r) Befehl(e) kann ich verwenden, um alles von der aktuellen Registerkarte bis zur nächsten Registerkarte zu löschen?

5voto

Benoit Punkte 72929

So löschen Sie die Spalten 4 und 5:

:%s/^\(.\{-}\t\)\{3}\zs.\{-}\t.\{-}\t//

Erläuterung:

^  => start of line

.\{} => as few characters as possible
\( .\{-}\t \)\{3} => three times as few characters as possible followed with a tab

\zs => start of match

Es könnte deutlicher sein mit dem \v Schalter:

:%s/\v^(.{-}\t){3}\zs.{-}\t.{-}\t//

3voto

Ich denke, Shift+ctrl+v ist das, wonach Sie suchen.

http://jvi.sourceforge.net/javahelpset/jvi-vis_block.html

2voto

Michael Berkowski Punkte 260923

Muss dies in vim geschehen? Wenn Sie eine Unix-Kommandozeile haben, würde ich stattdessen die gute alte cut Befehl. Der folgende Befehl zum Beispiel behält die erste Spalte und alles einschließlich und nach der vierten Spalte (2 und 3 werden verworfen)

cat filename | cut -d"\t" -f1,4- > outputfile

2voto

ZyX Punkte 50799

Sie können zwar reguläre Ausdrücke verwenden, aber es ist besser, einfache f o t normale Befehle: wenn Sie beim ersten Zeichen der ersten Spalte sind, die Sie löschen wollen d2f<Tab> löscht diese und die nächsten Spalten, es sei denn, eine Spalte kann einen Zeilenumbruch enthalten. Wenn dies der Fall ist, dann d2/<Tab>/e<CR> (ou d2/\t/e<CR> ) wird das tun, was Sie wollen. Um es auf andere Zeilen zu erweitern, verwenden Sie Makros: qaqqa01f<Tab>d2t<Tab>j@aq@a :

  1. qaq : klar a Register (beginnt mit der Aufzeichnung eines Makros, das in a registrieren und dann sofort die Aufzeichnung beenden, bevor Sie etwas anderes eingeben);
  2. qa : Aufzeichnung eines Makros im Register starten a ;
  3. 0 : gehen Sie an den Anfang der Linie;
  4. 1f<Tab> : Sprung zur nächsten Registerkarte. 1 kann hier weggelassen werden. Wenn Sie die erste Spalte löschen wollen, dann lassen Sie den ganzen Antrag weg;
  5. d2t<Tab> : Löschen auf der übernächsten Registerkarte;
  6. j : Weiter zur nächsten Zeile;
  7. @a Makros, die im Register gespeichert sind, ausführen a . Sie ist zu diesem Zeitpunkt leer (weil sie im 1. Punkt gelöscht wurde), es wird also eigentlich nichts getan;
  8. q : Aufzeichnung eines Makros beenden;
  9. @a Makros, die im Register gespeichert sind, ausführen a . Er enthält die Punkte 3-7 und im 7. Punkt wird er selbst ausgeführt.

1voto

Zsolt Botykai Punkte 48177
:%s:\t[^\t]\+\t:\t\t:

Dies löscht alles, was zwischen zwei Registerkarten liegt.

HTH

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