Wie kann ich mit vi alle Zeilen in einer Datei löschen?


269

Wie kann ich mit vi alle Zeilen in einer Datei löschen?

Im Moment mache ich das so, um alle Zeilen in einer Datei zu entfernen:

echo > test.txt

Wie kann ich mit alle Zeilen löschen vi?

Hinweis: Die Verwendung ddist keine gute Option. Es kann viele Zeilen geben.


5
Ich denke dG sollte funktionieren.
MadTux

11
@ MadTux, nur wenn Sie in der ersten Zeile beginnen. 1GdGwürde von überall arbeiten.
Holloway

1
echo | test.txtist kein gültiger Befehl, es test.txtsei denn, es handelt sich um ein ausführbares Skript. Ich vermute, du meinst echo >test.txtstattdessen?
Tripleee

Du hast recht @tripleee
Cold

5
Beachten Sie, dass das Nichtverwenden von vi, >test.txtausreicht, um die Länge auf Null zu verkürzen - dies ist nicht echoerforderlich.
abligh

Antworten:


473

In vido

:1,$d

um alle Zeilen zu löschen.

Das :führt einen Befehl ein (und bewegt den Cursor nach unten).
Dies 1,$ist eine Angabe, in welchen Zeilen der folgende Befehl ( d) arbeiten soll. In diesem Fall reicht der Bereich von Zeile eins bis zur letzten Zeile (angezeigt durch $, sodass Sie die Anzahl der Zeilen im Dokument nicht kennen müssen).
Das Finale dsteht für das Löschen der angegebenen Zeilen.

Es gibt eine kürzere Form ( :%d), aber ich verwende sie nie. Das :1,$dkann leichter "angepasst" werden, um zB :4,$-2dnur die ersten 3 und letzten 2 Zeilen zu belassen und den Rest zu löschen.


9
Profi-Tipp. No moreESC+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd...
rdev5

2
@ rdev5 versuche das .nächste Mal einen Befehl zu wiederholen
Gazihan Alankus

169

In vi benutze ich

:%d

wo

  • : Weist vi an, in den Befehlsmodus zu wechseln
  • % bedeutet alle Zeilen
  • d : löschen

In der Kommandozeile

> test.txt

werde auch tun.

Was ist das Problem mit dd?

dd if=/dev/null of=test.txt

wo

  • /dev/null ist eine spezielle 0-Byte-Datei
  • if ist die Eingabedatei
  • of ist die Ausgabedatei

Ich dachte, ddich brauche Pess für jede Zeile in der Datei.
Cold

Gut. Es ist einfacher als ich erwartet hatte ...
Cold

11
Sie müssen zwischen dddem Befehl vi (was das OP bedeutete) und dddem Dienstprogramm, für das Sie ein Beispiel geben, unterscheiden. Funktioniert > test.txtmöglicherweise auch nicht wie erwartet in Nicht-Bash-Shells (z. B. zsh).
Depquid

1
@depquid Oups! jetzt
überlege

2
Oder : >test.txtwas ist nur sehr unwesentlich länger.
Tripleee

53

Ich würde empfehlen, dass Sie dies einfach tun (sollte in jeder POSIX-kompatiblen Shell funktionieren):

> test.txt

Wenn du es wirklich mit vi machen willst, kannst du:

  • 1G (gehe zur ersten Zeile)
  • dG (bis zur letzten Zeile löschen)

30
@Cold: ... einmal?
Chris Down

5
Grepräsentiert die letzte Zeile. Wenn Sie sich in der ersten Zeile ( gg) befinden, dGweist Sie vi an, alle Zeilen von der aktuellen Zeile (erste Zeile) bis zur letzten Zeile zu entfernen. Also machst du es auf einen Schlag.
Unxnut

6
ggist vim spezifisch. Es ist 1Gin traditioneller vi.
Stéphane Chazelas

1
Ihre Shell-Syntax hängt von der Konfiguration einiger Shells ab. Sowohl bash als auch zsh (standardmäßig zsh) interaktive Shells können nach dem Empfang dieses Befehls auf die Eingabe in STDIN warten, und ein zusätzliches <STRG> + D ist erforderlich, um die Datei tatsächlich zu löschen. Die Fähigkeit zur Ausführung hängt auch von den CLOBBER-Einstellungen ab. >| test.txt < /dev/nullist etwas robuster, da die Datei immer überlastet wird und nicht auf Eingaben auf interaktiven Terminals gewartet werden muss.
Caleb

1
@Caleb: Wie gesagt, in jeder POSIX-kompatiblen Shell. :-) Keine dieser beiden Situationen ist eine POSIX-Beschwerde.
Chris Down

28

Befindet sich Ihr Cursor in der ersten Zeile (wenn nicht, geben Sie: ggoder ein 1G), können Sie einfach verwenden dG. Es werden alle Zeilen von der aktuellen Zeile bis zum Dateiende gelöscht. Um sicherzustellen, dass Sie alle Zeilen aus der Datei löschen, können Sie beide zusammenmischen. Dies wäre: ggdG(im Befehlsmodus).

Oder %din Ex - Modus - Befehlszeile Beispiel: vim +%d foo.bar.

Siehe auch: Wie kann ich in VIM den gesamten Text von der aktuellen Zeile bis zum Dateiende löschen?


3
+1 für mehr Ergonomie als: 1, $ d. Nicht, dass unsere Finger jetzt sowieso nicht für die Eingabe von Doppelpunkt die ganze Zeit verkabelt sind;)
Aaron R.

2
Upvoted. dGbenutze ich immer.
lunchmeat317

1
Ich finde dies ( ggdG) die einfachste Methode in vim. Der Grund, warum diese Antwort nicht positiv bewertet wird, ggist, dass sie in pure vi nicht existiert.
Thameera

27

Ich bin ein fauler Typ, und ich mag es einfach zu halten. ggdGist fünf Tastenanschläge einschließlichShift

ggGeht in die erste Zeile der Datei, dist der Anfang des delete-Verbs und Gist die Bewegung zum Ende der Datei. Ausführlich gesagt, geht es an den Anfang der Datei und löscht alles bis zum Ende der Kachel.


rsrs. Ich bin auch faul und benutze :$doder :1,$dist der schnellere Weg (ich schreibe weniger Zeichen) kkk
Cold

3
:%dist eine gute Alternative, da Sie auf diese Weise auch nur 5 Tastenanschläge verwenden.
TankorSmash

1
@TankorSmash ggist ein vimBefehl, nicht vi.
Cyrias

guter Fang, mein Fehler
TankorSmash


5

Ich benutze immer ggVG

  • gg Springt zum Anfang der aktuellen Bearbeitungsdatei
  • V(Großgeschriebenes v) wählt die aktuelle Zeile aus. In diesem Fall die erste Zeile der aktuellen Bearbeitungsdatei
  • G(mit einem Großbuchstaben von g) springt zum Ende der Datei. In diesem Fall wird, da ich die erste Zeile Gausgewählt habe, der gesamte Text in dieser Datei ausgewählt.

Dann können Sie einfach doder drücken x, um alle Zeilen zu löschen.


Wenn Sie dvertikal verwenden, wird dies automatisch zeilenweise angewendet. dllöscht ein Zeichen rechts, djlöscht beispielsweise eine Zeile nach unten.
TankorSmash

3

Beachten Sie, dass in Ihrer Frage echo > test.txteine Datei mit einem einzelnen Zeilenumbruch erstellt wird, keine leere Datei.

Ziehen Sie in der Shell die Verwendung von echo -n > test.txtoder in Betracht : > test.txt.

Während ich im Allgemeinen einen vi-Bearbeitungsbefehl verwende (ich verwende ggdG), können Sie die Shell auch mit einem Verweis auf die aktuelle Datei wie folgt aufrufen:

:!:>%

Es ist fast so kurz wie ggdG, aber schwieriger zu tippen, und Sie müssen auch bestätigen, dass Sie die geänderte Datei erneut laden möchten, sodass ich es in diesem Fall nicht besonders empfehle, aber zu wissen, wie man Shell-Befehle von vi wie folgt verwendet nützlich.

Brechen sie ab:

  • : starte einen vi Befehl
  • ! Starten Sie einen Shell-Befehl
  • : Dies ist ein in die Shell integrierter Befehl mit leerer Ausgabe
  • > Ausgabe umleiten
  • % vi ersetzt dies durch den Namen der aktuellen Datei

Der Vorschlag :1,$dist natürlich auch gut, und wenn ich gerade dabei bin, gibt es ihn auch1GdG


:!:>%Dies ist auch gefährlich, da vider Dateiname für die Shell nicht maskiert wird (tun Sie dies nicht, wenn Sie beispielsweise eine aufgerufene Datei bearbeiten $(reboot)). Sie brauchen etwas:call system(":>" . shellescape(expand("%")))
Stéphane Chazelas

3

Eine andere Lösung:

truncate -s 0 file

Nicht wirklich einfacher als >fileaber OK.
Phk

1
Scheint eine gute Methode zu sein, aber das Ziel macht es mit vi. Tks
Cold


-1

Mit einem Trick können Sie eine große Anzahl von Zeilen löschen. Stellen Sie sicher, dass Sie sich nicht im Einfügemodus befinden (drücken Sie die ESC-Taste), und geben Sie 1000dd ein.


1
Sie sollten die Erklärung zur Funktionsweise des Befehls einfügen (löscht die nächsten 1000 Zeilen, wodurch nicht alle Zeilen gelöscht werden, wenn sich der Cursor nicht in der ersten Zeile befindet).
16.

Aus diesem Grund habe ich es einen Trick genannt :)
Radu

-1

Ich tippe gg, um die obersten Zeilen zu erreichen, und mache dann a 100 dd. Dies bringt den Zeiger auf die oberste Zeile des Editors und löscht von dort 100 Zeilen. Möglicherweise müssen Sie die Anzahl anpassen, um weitere Zeilen hinzuzufügen, wenn die Datei länger ist.


-1
> file.txt

Sie müssen nicht einmal vi öffnen, es sei denn, Sie möchten wirklich.


1
Hallo und willkommen auf der U & L Stack Exchange Site. In der Hilfe finden Sie Informationen zum besten Posten dieser Website. Wir möchten auf dieser Site informative und einzigartige Fragen und Antworten pflegen. Ihre Antwort ist identisch mit anderen Antworten und Kommentaren zu diesem Beitrag. Bitte bearbeiten Sie Ihren Beitrag, um eine einzigartigere und informativere Antwort zu erhalten. Danke!
Kemotep

Außerdem ist der Punkt der Frage ... "using vi"
Jeff Schaller

Ich habe genau das ausprobiert, was Sie vorgeschlagen haben. Ich habe bekommen bash: > file.txt: command not found.
Roaima

@roaima Das würdest du bekommen, wenn du das Ding als zitierst "> file.txt".
Kusalananda

1
@JeffSchaller : vi >file.txt ;-)
Kusalananda
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.