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?
Antworten
Zu viele Anzeigen?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//
Nicht registrierter Benutzer
Punkte
0
Michael Berkowski
Punkte
260923
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
:
qaq
: klara
Register (beginnt mit der Aufzeichnung eines Makros, das ina
registrieren und dann sofort die Aufzeichnung beenden, bevor Sie etwas anderes eingeben);qa
: Aufzeichnung eines Makros im Register startena
;0
: gehen Sie an den Anfang der Linie;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;d2t<Tab>
: Löschen auf der übernächsten Registerkarte;j
: Weiter zur nächsten Zeile;@a
Makros, die im Register gespeichert sind, ausführena
. Sie ist zu diesem Zeitpunkt leer (weil sie im 1. Punkt gelöscht wurde), es wird also eigentlich nichts getan;q
: Aufzeichnung eines Makros beenden;@a
Makros, die im Register gespeichert sind, ausführena
. Er enthält die Punkte 3-7 und im 7. Punkt wird er selbst ausgeführt.
Zsolt Botykai
Punkte
48177