Vim leere Zeilen löschen

674

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

fast mittags
quelle

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)

Soulmerge
quelle
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.

fast mittags
quelle
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
53
:v/./d

oder

:g/^$/d

oder

:%!cat -s
Mandaleeka
quelle
7
Ordentlicher Trick mit: v /./ d (einfacher zu tippen), aber danach müssen Sie a: nohl machen.
Claes Mogren
1
@ ClaesMogren oder einfach auf Kontrolle-l
springen
6
@zladuric laut vim.wikia.com/wiki/Power_of_g ist es reVerse global (also macht es den Befehl für alles, was nicht passt)
adam_0
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
Draemon
quelle
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

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

Wie wäre es mit:

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

quelle
5

arbeite mit perl in vim:

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

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

Das funktioniert bei mir

:%s/^\s*$\n//gc

allenhwkim
quelle
Ich benutze etwas ähnliches::%s/^\n//gc
Clint Pachl
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>
SergioAraujo
quelle
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

Pokey
quelle
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!

cn8341
quelle
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/^^^^.*
MisterW
quelle
2

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

akp
quelle
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.

user1481441
quelle