Wie entferne ich leere / leere Zeilen aus einer Datei in Unix (einschließlich Leerzeichen)?


60

Wie entferne ich leere / leere Zeilen (einschließlich Leerzeichen) in einer Datei unter Unix / Linux über die Befehlszeile?

Inhalt von file.txt

Line:Text
1:<blank>
2:AAA
3:<blank>
4:BBB
5:<blank>
6:<space><space><space>CCC
7:<space><space>
8:DDD

Ausgabe erwünscht

1:AAA
2:BBB
3:<space><space><space>CCC
4:DDD

1
Informationen zu awk finden Sie unter: Entfernen von Leerzeilen in awk oder unter Verwendung von grep im Allgemeinen unter: Entfernen von Leerzeilen aus einer Datei in der Shell.
Kenorb


1
Dies ist eine epische Antwort, die so ziemlich jede mögliche Lösung mit grep, sed, awk bietet
wisbucky

Antworten:


86

Diese Sed-Linie sollte den Trick machen:

sed -i '/^$/d' file.txt

Dies -ibedeutet, dass die Datei direkt bearbeitet wird.


13
Es muss tatsächlich "/ ^ * $ / d" sein, um Zeilen zu entfernen, die nur Leerzeichen enthalten.
Sean Reifschneider

2
@SeanReifschneider Diese Anforderung stand nicht in der Frage, als diese Antwort geschrieben wurde?
Kasperd

4
@SeanReifschneider Wäre "/ ^ \ s * $ / d" nicht besser, da es Tabulatoren enthalten würde? Obwohl es im ursprünglichen Beitrag nicht erwähnt wird, scheint es mir eine stärkere Option zu sein.
Mrswadge


Ich bekommebad flag in substitute command: 'e'
ishandutta2007

29

grep

Eine einfache Lösung ist die Verwendung des folgenden Befehls grep( GNU oder BSD ).

  • Entfernen Sie Leerzeilen (ohne Leerzeichen).

    grep . file.txt
    
  • Entfernen Sie vollständig leere Zeilen (einschließlich Zeilen mit Leerzeichen).

    grep "\S" file.txt
    

Hinweis: Wenn Sie unerwünschte Farben erhalten, bedeutet dies, dass Sie grepAliasnamen haben grep --color=auto(überprüfen durch type grep). In diesem Fall können Sie --color=noneParameter hinzufügen oder einfach den Befehl as ausführen \grep(der den Alias ​​ignoriert).


ripgrep

Ähnliches gilt für ripgrep(geeignet für viel größere Dateien).

Leerzeilen ohne Leerzeichen entfernen:

rg -N . file.txt

oder einschließlich Zeilen mit Leerzeichen:

rg -N "\S" file.txt

Siehe auch:


2
grep .scheint die einfachste Lösung zu sein.
Leo

Der Nachteil im grep .Vergleich zu den anderen Lösungen ist, dass der gesamte Text rot hervorgehoben wird. Die anderen Lösungen können die ursprünglichen Farben beibehalten. Vergleichen Sie unbuffer apt search foo | grep .mitunbuffer apt search foo | grep -v ^$
wisbucky

1
@wisbucky Du siehst Farben, weil auf deinem System ein grepAlias ​​vorliegt grep --color=auto(check by :) type grep. Sie können es als Parameter ausführen \grepoder verwenden --color=none.
Kenorb

@kenorb Wenn Sie verwenden grep --color=none ., erhalten Sie alle weißen Text erhalten, die die Farbe Formatierung des ursprünglichen Befehl außer Kraft gesetzt (Beispiel: apt search foo)
wisbucky

grep .passt auf Zeilen, die nur Leerzeichen enthalten, was laut OP nicht erwünscht ist.
Jim L.

27
sed '/^$/d' file.txt

d ist der sed-Befehl zum Löschen einer Zeile. ^$ist ein regulärer Ausdruck, der nur einer leeren Zeile entspricht, einem Zeilenanfang gefolgt von einem Zeilenende.


+1 für die Erklärung
Alex Raj Kaliamoorthy

Dieser Befehl erzeugt nicht die gleiche Ausgabe wie der angeforderte OP (er erzeugt 5 Zeilen, nicht 4).
Kenorb

22

Sie können die Option -v mit grep verwenden, um die übereinstimmenden Leerzeilen zu entfernen.

So was

grep -Ev "^$" file.txt

4
Ich glaube nicht, dass Sie das brauchen -E, zumindest nicht mit GNU grep, aber ansonsten freue ich mich sehr, dass dies mit grep geschehen ist! Es ist das, wonach ich jedes Mal lieber greife als zu sedieren. Inline-Filter scheinen mir besser zu sein als Inline-Editoren.
MadHatter

Wenn Sie die kommentierten und leeren Zeilen überspringen möchten, verwenden Siegrep -Ev '^#|^$' file.txt
Govind Kailas

7

Hier ist eine awkLösung:

awk NF file.txt

Bei Awk NFnur auf nicht leere Zeilen setzen. Wenn diese Bedingung zutrifft, wird standardmäßig die gesamte Zeile gedruckt.


6

Um leere Zeilen zu entfernen, können Sie die neuen Zeilenwiederholungen wie folgt zusammenpressen tr:

cat file.txt | tr -s '\n' '\n'

Dies erzeugt 6 Zeilen, nicht 4 als OP angefordert.
Kenorb

1

xargs, wenn es Ihnen nichts ausmacht, führende Leerzeichen zu entfernen

$ docker run -it --rm alpine sh
/ # cat <<eof > /tmp/file
> one
>
>   two
> three
>
>
>   four
> eof
/ # cat /tmp/file
one

  two
three


  four
/ # cat /tmp/file | xargs -n1
one
two
three
four

0

Ex / Vim

Hier ist die Methode mit dem exEditor (Teil von Vim):

ex -s +'v/\S/d' -cwq test.txt

Für mehrere Dateien (direkt bearbeiten):

ex -s +'bufdo!v/\S/d' -cxa *.txt

Hinweis: Der :bufdoBefehl ist nicht POSIX .

Ohne die Datei zu ändern (einfach auf der Standardausgabe drucken):

cat test.txt | ex -s +'v/\S/d' +%p +q! /dev/stdin

0

Für mich @ martigin-heemels Befehl war werfen Fehler dies behoben (dh ein Dummy-Parameter zu i),

sed -i '' '/^$/d' file.txt


0

Der wahrscheinlich einfachste Weg, leere Zeilen (ohne Leerzeichen) zu entfernen, ist cat -s:

$ cat -s file
$ some-command | cat -s

Zumindest, wenn Sie eine Datei nicht direkt bearbeiten möchten, sondern beispielsweise stattdessen in das Terminal schreiben möchten. Es geht auch nicht um ein lustiges Regex-Geschäft, so dass es auch für nicht-RE-freundliche Menschen sehr leicht zu merken ist.


Von man cat:

-s, --squeeze-blank never more than one single blank line

Könnte auf verschiedenen Betriebssystemen unterschiedlich sein, war aber auf einigen Linuxen und OpenBSD vorhanden, als ich das letzte Mal nachgesehen habe.

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.