Vim leere Zeilen löschen


674

Welchen Befehl kann ich ausführen, um Leerzeilen in Vim zu entfernen?

Antworten:


1232
:g/^$/d

:gführt einen Befehl in Zeilen aus, die einem regulären Ausdruck entsprechen. Der reguläre Ausdruck ist 'Leerzeile' und der Befehl lautet :d(Löschen)


38
Danke soulmerge. Dies ist meine Lieblingsantwort, da sie tatsächlich erklärt, was der Befehl: g bewirkt.
Tim Swast

4
Dadurch werden alle Leerzeilen gelöscht (enthalten keine Leerzeichen ..), dies ist jedoch möglicherweise nicht die eindeutige Anforderung. Jemand kann immer noch eine der leeren Zeilen behalten. :%!cat -skann die Wahl sein ..
coanor

2
: g / ^ \ s * $ / d mit einem
regulären Ausdruck

180

Fand es, es ist:

g/^\s*$/d

Quelle: Kraft von g bei vim wikia

Kurze Erklärung von :g

:[range]g/pattern/cmd

Dies wirkt sich auf den angegebenen [Bereich] (standardmäßige gesamte Datei) aus, indem der Ex-Befehl cmd für jedes Zeilenvergleichsmuster ausgeführt wird (ein Ex-Befehl beginnt mit einem Doppelpunkt, z. B. :dzum Löschen). Vor dem Ausführen von cmd wird " ." auf die aktuelle Zeile gesetzt.


9
Nett. Aber nicht gerade eine leere Zeile.
InnaM

13
Ah, ja, dies stimmt mit Zeilen überein, die nur Leerzeichen enthalten. Ich werde die Antwort von soulmerge akzeptieren.
Fast Mittag

16
das sollte mit Leerzeilen UND Zeilen übereinstimmen, die nur aus Leerzeichen bestehen ... (* entspricht null oder mehreren Instanzen von \ s ...)?
Monojohnny

14
Ich würde behaupten, dass reines Leerzeichen genau eine leere Zeile ist, während kein Leerzeichen wirklich eher eine leere Zeile ist, finden Sie nicht? ;)
Kasapo

4
Laut Oxford ist ein Leerzeichen "ein Leerzeichen, das in einem Dokument ausgefüllt werden muss". Interpretieren Sie das so, wie Sie möchten, aber genau das habe ich gesucht. Vielen Dank!
Joe Tricarico


44

Das Folgende kann verwendet werden, um nur mehrere Leerzeilen zu entfernen (sie auf eine einzelne Leerzeile zu reduzieren) und einzelne Leerzeilen intakt zu lassen:

:g/^\_$\n\_^$/d

3
Könnte jemand erklären, was die Token bedeuten? (Also, wie funktioniert es?) Danke.
PAStheLoD

5
\_$bedeutet das Zeilenende , das innerhalb eines Musters verwendet werden $kann ( kann nur am Ende des Musters verwendet werden). Gleiches gilt \_^für den Zeilenanfang und kann überall innerhalb des Musters verwendet werden. Das Muster entspricht also einer leeren Zeile, einer neuen Zeile und erneut einer leeren Zeile. Siehe Vim Regex-Hilfeseite .
Wiktor Stribiżew

1
Ein anderer Weg, um das gleiche zu tun::g/^$/,/./-j
SergioAraujo

14
  1. wie man alle Leerzeilen entfernt

    :%s,\n\n,^M,g
    

    (Tun Sie dies mehrmals, wenn alle leeren Zeilen verschwunden sind.)

  2. So entfernen Sie alle Leerzeilen, wobei die EINZELNE leere Zeile übrig bleibt

    :%s,\n\n\n,^M^M,g
    

    (mehrmals tun)

  3. wie man alle Leerzeilen entfernt und ZWEI Leerzeilen bei MAXIMUM belässt,

    :%s,\n\n\n\n,^M^M^M,g
    

    (mehrmals tun)

Um ^ M einzugeben, muss ich Q und M in Windows steuern


2
Sie können auch \ranstelle der verwenden Ctrl-M.
Dash-Tom-Bang

6

Wie wäre es mit:

:g/^[ \t]*$/d

5

arbeite mit perl in vim:

:%!perl -pi -e s/^\s*$//g


Mein Perl ist vielleicht ein bisschen rostig, würde aber nicht chompauch den Job machen?
Mark K Cowan


5

Diese Funktion entfernt nur zwei oder mehr Leerzeilen, fügt die folgenden Zeilen in Ihr vimrc ein und ruft dann mit \ d die Funktion auf

fun! DelBlank()
   let _s=@/
   let l = line(".")
   let c = col(".")
   :g/^\n\{2,}/d
   let @/=_s
   call cursor(l, c)
endfun
map <special> <leader>d :keepjumps call DelBlank()<cr>

4

Ich habe einige der Antworten auf dieser Seite ausprobiert, aber viele haben bei mir nicht funktioniert. Vielleicht, weil ich Vim unter Windows 7 verwende (nicht verspotten, nur Mitleid mit mir haben: p)?

Hier ist die einfachste, die ich gefunden habe und die unter Vim in Windows 7 funktioniert:

:v/\S/d

Hier ist eine längere Antwort auf Vim Wikia: http://vim.wikia.com/wiki/Remove_unwanted_empty_lines


3
:g/^\s*$/d
^ begin of a line
\s* at least 0 spaces and as many as possible (greedy)
$ end of a line

Einfügen

:command -range=% DBL :<line1>,<line2>g/^\s*$/d

Starten Sie dann in Ihrem .vimrc Ihr vim neu. Wenn Sie den Befehl: 5,12DBL verwenden, werden alle Leerzeilen zwischen der 5. und 12. Zeile gelöscht. Ich denke meine Antwort ist die beste Antwort!


Wenn Sie Antworten veröffentlichen, fügen Sie bitte eine Erklärung hinzu und beschreiben Sie, was Sie geändert oder hinzugefügt haben oder wie es funktioniert oder so. Auch wenn Ihre Antwort die Lösung sein mag, ist es wahrscheinlich, dass einige Leute, die dies lesen, nicht verstehen, was es bedeutet oder wie es funktioniert. Und bitte mach es auf Englisch.
Tim

Das ist hier nicht wirklich wichtig. Diese Frage hat eine Antwort vor 5 Jahren angenommen
Tim

Ich denke, Soulmerges Antwort: g / ^ $ / d ist nicht die beste Antwort. Und ich bearbeite, um seine Antwort zu verbessern mit: g / ^ \ s * $ / d. aber warum kann ich meine Bearbeitung in "Alle Änderungen an dieser Pose anzeigen" nicht sehen?
cn8341

Meine Antwort ist besser als seine Antwort, und wer hat meine Antwort abgelehnt und warum wurde meine Antwort abgelehnt?
cn8341

2

Wenn Ihr Text einen doppelten Zeilenabstand hat, entfernt dieser Befehl den doppelten Abstand und führt bereits vorhandene, sich wiederholende Leerzeilen zu einer einzelnen Leerzeile zusammen. Es wird ein temporäres Trennzeichen von ^^^ am Anfang einer Zeile verwendet. Wenn dies mit Ihrem Inhalt kollidiert, wählen Sie etwas anderes. Zeilen, die nur Leerzeichen enthalten, werden als leer behandelt.

%s/^\s*\n\n\+/^^^\r/g | g/^\s*$/d | %s/^^^^.*

2

Drücken Sie deleteTaste im Einfügemodus , um Leerzeilen zu entfernen.


1

Das hat bei mir funktioniert:

:%s/^[^a-zA-Z0-9]$\n//ig

Grundsätzlich werden alle Zeilen gelöscht, die keine Zahl oder keinen Buchstaben haben. Da alle Elemente in meiner Liste Buchstaben enthielten, wurden alle Leerzeilen gelöscht.

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.