Wie kann ich mehrere Zeilen in vi löschen?


129

Ich habe versucht, Folgendes zu befolgen:

So löschen Sie ausgewählten Text im VI-Editor

aber

5dd

gibt

E492: Kein Editorbefehl: 5dd

Ich habe dann versucht:

5d

Was nur eine einzelne Zeile löscht. Wie kann ich mehrere Zeilen löschen?


2
Soweit ich mich erinnere, sollte 5dd eine gültige Syntax sein und 5 Zeilen löschen, beginnend mit der Zeile, auf der sich der Cursor befindet. Gibt es eine Chance, dass CAPS LOCK aktiviert ist und Sie ein Tastaturlayout verwenden, bei dem sich die Zifferntasten verschieben, wenn dies der Fall ist?
Eric J.

Antworten:


132

Klingt so, als würden Sie die Befehle im Befehlsmodus eingeben (auch bekannt als "Ex-Modus"). In diesem Zusammenhang :5dwürde Zeile 5 entfernen, sonst nichts. Damit Sie 5ddwie beabsichtigt arbeiten können - dh fünf aufeinanderfolgende Zeilen ab dem Cursor entfernen -, geben Sie sie im normalen Modus ein und stellen Sie den Befehlen kein Präfix voran :.



142

Sie können mehrere (Bereichs-) Zeilen löschen, wenn Sie die Zeilennummern kennen:

:[start_line_no],[end_line_no]d

Hinweis: d steht für Löschen

Dabei ist
start_line_no die Anfangszeile, die Sie löschen möchten, und end_line_no ist die Endzeile, die Sie löschen möchten. Die Zeilen zwischen Start und Ende, einschließlich Start und Ende, werden gelöscht.

Z.B:

:45,101d

Die Zeilen zwischen 45 und 101 einschließlich 45 und 101 werden gelöscht.


14
Sie können auch $die letzte Zeile in der Datei angeben. Also :45,$dwürde jede Zeile von 45 bis zum Ende löschen.
Freethebees

Sie können sogar Muster wie/<\/div>/
Björn

1
Wenn Sie den Bereich von dem Punkt aus starten möchten, an dem Sie sich gerade befinden, können Sie dies tun:.,[end_line_no]d
Joe,

15

Befehle, die zur Verwendung im normalen Modus aufgelistet sind (Präfix mit :für den Befehlsmodus).
In Vim getestet.

Nach Zeilenbetrag:

  • NUMdd - löschen num Zeilen nach unten Startzählung von aktueller Cursorposition (z 5ddlöschen aktuelle Zeile und 4 Zeilen darunter => löscht aktuelle Zeile und ( num-1 ) Zeilen darunter )
  • numdk - löscht num Zeilen UP von der aktuellen Zeile und der aktuellen Zeile selbst (z. B. 3dklöscht die aktuelle Zeile und 3 Zeilen darüber => löscht die aktuelle Zeile und num Zeilen darüber )

Nach Zeilennummern:

  • dnumG - löscht Zeilen aus der aktuellen Zeile (einschließlich) bis zur Zeilennummer num (einschließlich) (z. B. wenn sich der Cursor derzeit in Zeile 5 befindet, d2Gwerden die Zeilen 2-5 einschließlich gelöscht)
  • dnumgg - löscht Zeilen aus der aktuellen Zeile (einschließlich) AB nach unten bis zur Zeilennummer num (einschließlich) (z. B. wenn sich der Cursor derzeit in Zeile 2 befindet, d6ggwerden die Zeilen 2-6 einschließlich gelöscht)
  • ( nur :Befehlsmodus ) num1 ,num2d - löscht die Zeilen Zeilennummer num1 (einschließlich) DOWN bis zur Zeilennummer num2 (einschließlich) . Hinweis: Wenn num1 größer als num2 ist, reagiert vim mitBackwards range given, OK to swap (y/n)?

1
Dies hat mir geholfen, weil ich nicht bemerkt habe, dass num 'd' 'd' versucht hat, unter dem Cursor zu löschen. Ich hatte meinen Cursor am Ende der Datei und versuchte, die Zeilen über meinem Cursor zu löschen! Danke für die Hilfe!
Jonathan Chad Faling

Löschen nach Leinennummer: ': <Start>, $ d' wird bis zum Ende der Datei gelöscht.
Devolus

11

Wenn Sie eine nicht visuelle Modusmethode bevorzugen und die Zeilennummern bestätigen, möchte ich Ihnen einen anderen einfachen Weg vorschlagen.

Beispiel

Ich möchte Text aus Zeile 45 bis Zeile 101 löschen.

Meine Methode schlägt vor, dass Sie im Befehlsmodus einen der folgenden Befehle eingeben:

45Gd101G

Es liest:

Gehen Sie zu Zeile 45 ( 45G) und löschen Sie Text ( d) aus der aktuellen Zeile in Zeile 101 ( 101G).

Beachten Sie, dass vimSie gganstelle von verwenden können G.

Vergleichen Sie mit der Antwort von @Bonnie Varghese:

:45,101d[enter]

Der obige Befehl aus seiner Antwort erfordert 9-maliges Tippen, einschließlich enter, wobei meine Antwort 8- bis 10-maliges Tippen erfordert. Somit ist eine Geschwindigkeit meiner Methode vergleichbar.

Persönlich ich mich lieber 45Gd101Güber , :45,101dweil ich wie auf Stick auf die Syntax des Befehls des vi, in diesem Fall:

+---------+----------+--------------------+
| syntax  | <motion> | <operator><motion> |
+---------+----------+--------------------+
| command |   45G    |        d101G       |
+---------+----------+--------------------+

8

d5d "schneidet" fünf Zeilen

Normalerweise werfe ich die Zahl einfach in die Mitte wie:

d7l = 7 Buchstaben löschen


7

Drücken Sie die EscTaste, um sicherzustellen, dass Sie sich nicht in einem Bearbeitungsmodus befinden. Platzieren Sie den Cursor in der ersten zu löschenden Zeile. Geben Sie ein :5dd. Die aktuelle Zeile und die nächsten vier Zeilen sollten gelöscht werden.

Alternativ, wenn Sie die Zeilennummerierung aktiviert haben ...

Drücken Sie die EscTaste, um sicherzustellen, dass Sie sich nicht in einem Bearbeitungsmodus befinden. Geben Sie ein, :#,#dwo '#' für die zu löschenden Anfangs- und Endzeilennummern steht.


Ich glaube nicht, dass es am Anfang mit Doppelpunkt funktioniert.
Ausgestoßener

@PoeteMaudit Dies sind gültige vi-Befehle. Der Doppelpunkt bewirkt, dass vi den Cursor an den unteren Bildschirmrand bewegt und einen Zeileneditorbefehl akzeptiert.
Kenster

5
  1. Esc um den Einfügemodus zu verlassen
  2. :1enter gehe zu Zeile 1 (ersetze '1' durch die Zeile, die dich interessiert)
  3. 5dd 5 Zeilen löschen (aus der aktuellen Zeile)

Typ (für nummerierte Zeilen).:set number


3

Wenn Sie einen Bereich NACH einem bestimmten Zeilentrigger löschen möchten, können Sie so etwas verwenden

:g/^TMPDIR/ :.,+11d

Das löscht 11 Zeilen (einschließlich) nach jeder Begegnung von ^TMPDIR.


0

es ist dxd, nicht ddx

Wenn Sie 5 Zeilen löschen möchten, bewegen Sie den Cursor auf den Anfang der ersten zu löschenden Zeile und d5d


0

Um alle Zeilen zu löschen, verwenden Sie - ESC gg dG. Um einige Zeilen zu löschen, sagen wir 5 und verwenden Sie ESC 5dd


-1

Es könnte wie folgt gemacht werden ..

  1. Positionieren Sie den Cursor an der Stelle, die Sie löschen möchten.
  2. Drücken Sie "v", um die visuelle Auswahl zu starten.
  3. Bewegen Sie den Cursor mit der Pfeiltaste an die Position, die Sie löschen möchten.
  4. Drücken Sie "d", um die Zeilen zu löschen.
  5. Speichern und beenden Sie nun mit ": x!"
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.