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
Michael Ellick Ang
quelle
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.

Martijn Heemels
quelle
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:

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

Kamil Kisiel
quelle
+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
jdabney
quelle
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.

Steven Penny
quelle
6

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

cat file.txt | tr -s '\n' '\n'
Siddhadev
quelle
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
Christian Calloway
quelle
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
Kenorb
quelle
0

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

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

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

kyrill
quelle