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 dd
ist keine gute Option. Es kann viele Zeilen geben.
1GdG
würde von überall arbeiten.echo | test.txt
ist kein gültiger Befehl, estest.txt
sei denn, es handelt sich um ein ausführbares Skript. Ich vermute, du meinstecho >test.txt
stattdessen?vi
,>test.txt
ausreicht, um die Länge auf Null zu verkürzen - dies ist nichtecho
erforderlich.Antworten:
In
vi
doum 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
d
steht für das Löschen der angegebenen Zeilen.Es gibt eine kürzere Form (
:%d
), aber ich verwende sie nie. Das:1,$d
kann leichter "angepasst" werden, um zB:4,$-2d
nur die ersten 3 und letzten 2 Zeilen zu belassen und den Rest zu löschen.quelle
ESC+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd...
.
nächste Mal einen Befehl zu wiederholenIn vi benutze ich
wo
:
Weist vi an, in den Befehlsmodus zu wechseln%
bedeutet alle Zeilend
: löschenIn der Kommandozeile
werde auch tun.
Was ist das Problem mit dd?
wo
/dev/null
ist eine spezielle 0-Byte-Dateiif
ist die Eingabedateiof
ist die Ausgabedateiquelle
dd
ich brauche Pess für jede Zeile in der Datei.dd
dem Befehl vi (was das OP bedeutete) unddd
dem Dienstprogramm, für das Sie ein Beispiel geben, unterscheiden. Funktioniert> test.txt
möglicherweise auch nicht wie erwartet in Nicht-Bash-Shells (z. B. zsh).: >test.txt
was ist nur sehr unwesentlich länger.Ich würde empfehlen, dass Sie dies einfach tun (sollte in jeder POSIX-kompatiblen Shell funktionieren):
Wenn du es wirklich mit vi machen willst, kannst du:
quelle
G
repräsentiert die letzte Zeile. Wenn Sie sich in der ersten Zeile (gg
) befinden,dG
weist Sie vi an, alle Zeilen von der aktuellen Zeile (erste Zeile) bis zur letzten Zeile zu entfernen. Also machst du es auf einen Schlag.gg
ist vim spezifisch. Es ist1G
in traditioneller vi.>| test.txt < /dev/null
ist etwas robuster, da die Datei immer überlastet wird und nicht auf Eingaben auf interaktiven Terminals gewartet werden muss.Befindet sich Ihr Cursor in der ersten Zeile (wenn nicht, geben Sie:
gg
oder ein1G
), können Sie einfach verwendendG
. 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
%d
in 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?
quelle
dG
benutze ich immer.ggdG
) die einfachste Methode in vim. Der Grund, warum diese Antwort nicht positiv bewertet wird,gg
ist, dass sie in pure vi nicht existiert.Ich bin ein fauler Typ, und ich mag es einfach zu halten.
ggdG
ist fünf Tastenanschläge einschließlichShift
gg
Geht in die erste Zeile der Datei,d
ist der Anfang desd
elete-Verbs undG
ist 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.quelle
:$d
oder:1,$d
ist der schnellere Weg (ich schreibe weniger Zeichen) kkk:%d
ist eine gute Alternative, da Sie auf diese Weise auch nur 5 Tastenanschläge verwenden.gg
ist einvim
Befehl, nichtvi
.Gehen Sie zum Anfang der Datei und drücken Sie dG.
quelle
Ich benutze immer
ggVG
gg
Springt zum Anfang der aktuellen BearbeitungsdateiV
(Großgeschriebenes v) wählt die aktuelle Zeile aus. In diesem Fall die erste Zeile der aktuellen BearbeitungsdateiG
(mit einem Großbuchstaben von g) springt zum Ende der Datei. In diesem Fall wird, da ich die erste ZeileG
ausgewählt habe, der gesamte Text in dieser Datei ausgewählt.Dann können Sie einfach
d
oder drückenx
, um alle Zeilen zu löschen.quelle
d
vertikal verwenden, wird dies automatisch zeilenweise angewendet.dl
löscht ein Zeichen rechts,dj
löscht beispielsweise eine Zeile nach unten.Beachten Sie, dass in Ihrer Frage
echo > test.txt
eine Datei mit einem einzelnen Zeilenumbruch erstellt wird, keine leere Datei.Ziehen Sie in der Shell die Verwendung von
echo -n > test.txt
oder 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 DateiDer Vorschlag
:1,$d
ist natürlich auch gut, und wenn ich gerade dabei bin, gibt es ihn auch1GdG
quelle
:!:>%
Dies ist auch gefährlich, davi
der 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("%")))
Eine andere Lösung:
quelle
>file
aber OK.Typ
:
und%d
(Nicht im Einfügemodus. Drücken Sie in diesem Fall zuerst die Escape-Taste.)
quelle
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.
quelle
Ich tippe
gg
, um die obersten Zeilen zu erreichen, und mache dann a100 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.quelle
Sie müssen nicht einmal vi öffnen, es sei denn, Sie möchten wirklich.
quelle
bash: > file.txt: command not found
."> file.txt"
.: vi >file.txt
;-)