it-swarm.com.de

Leere Zeilen mit sed löschen

Ich versuche mit sed Leerzeilen zu löschen:

sed '/^$/d'

aber ich habe kein glück damit.

Zum Beispiel habe ich diese Zeilen:

xxxxxx


yyyyyy


zzzzzz

und ich möchte, dass es so ist:

xxxxxx
yyyyyy
zzzzzz

Was soll der Code dafür sein?

303
jonas

Möglicherweise haben Sie Leerzeichen oder Tabulatoren in Ihrer "leeren" Zeile. Verwenden Sie POSIX-Klassen mit sed, um alle Zeilen zu entfernen, die nur Leerzeichen enthalten:

sed '/^[[:space:]]*$/d'

Eine kürzere Version, die ERE verwendet, zum Beispiel mit gnu sed:

sed -r '/^\s*$/d'

(Beachten Sie, dass sed NICHT PCRE unterstützt.)

569
Kent

Mir fehlt die awk Lösung:

awk 'NF' file

Welches würde zurückkehren:

xxxxxx
yyyyyy
zzzzzz

Wie funktioniert das? Da NF für "number of fields" steht, haben diese leeren Zeilen 0 fiedls, so dass awk 0 zu False bewertet und keine Zeile gedruckt wird; Wenn jedoch mindestens ein Feld vorhanden ist, lautet die Bewertung "Wahr" und veranlasst awk, seine Standardaktion auszuführen: Drucken der aktuellen Zeile.

74
fedorqui

sed '/^$/d' sollte in Ordnung sein, erwarten Sie, die Datei an Ort und Stelle zu ändern? In diesem Fall sollten Sie das Flag -i verwenden.

Vielleicht sind diese Zeilen nicht leer, also wenn das der Fall ist, schauen Sie sich diese Frage an Entfernen Sie leere Zeilen aus txt-Dateien, entfernen Sie Leerzeichen vom Anfang und Ende der Zeile Ich glaube, das ist, was Sie erreichen wollen.

53
34
Oleg Mazko

Ich glaube das ist das einfachste und schnellste:

cat file.txt | grep .

Wenn Sie auch alle Leerzeichen ignorieren müssen, versuchen Sie Folgendes:

cat file.txt | grep '\S'

Beispiel:

s="\
\
a\
 b\
\
Below is TAB:\
    \
Below is space:\
 \
c\
\
"; echo "$s" | grep . | wc -l; echo "$s" | grep '\S' | wc -l

ausgänge

7
5
29
Vadim

Mit Hilfe der akzeptierten Antwort hier und der oben angegebenen akzeptierten Antwort habe ich Folgendes verwendet:

$ sed 's/^ *//; s/ *$//; /^$/d; /^\s*$/d' file.txt > output.txt

`s/^ *//`  => left trim
`s/ *$//`  => right trim
`/^$/d`    => remove empty line
`/^\s*$/d` => delete lines which may contain white space

Dies deckt alle Grundlagen ab und funktioniert perfekt für meine Bedürfnisse. Ein großes Lob an die Originalposter @Kent und @kev

14
ConMan

Sie können sagen:

sed -n '/ / p' filename    #there is a space between '//'
5
tank

Das unerwartete Verhalten tritt höchstwahrscheinlich auf, weil Ihre Textdatei unter Windows erstellt wurde. Das Ende der Zeilenfolge lautet also \r\n. Sie können dos2unix verwenden, um es in eine Textdatei im UNIX-Stil zu konvertieren, bevor Sie sed oder use ausführen

sed -r "/^\r?$/d"

um Leerzeilen zu entfernen, unabhängig davon, ob der Wagenrücklauf vorhanden ist oder nicht.

2
FauChristian

Sie können so etwas auch mit "grep" machen:

egrep -v "^$" file.txt
2
Lowbit

Dies funktioniert auch in awk.

awk '!/^$/' file
xxxxxx
yyyyyy
zzzzzz
2
Claes Wikner

Meine bash -spezifische Antwort ist, die Verwendung des Perl -Ersetzungsoperators mit dem globalen Muster g -Flag wie folgt zu empfehlen:

$ Perl -pe s'/^\n|^[\ ]*\n//g' $file
xxxxxx
yyyyyy
zzzzzz

Diese Antwort zeigt, wie berücksichtigt wird, ob die leeren Zeilen Leerzeichen enthalten ([\ ]*), und wie | zum Trennen mehrerer Suchbegriffe/Felder verwendet wird. Getestet auf macOS High Sierra und CentOS 6/7.

Zu Ihrer Information, der ursprüngliche OP-Code sed '/^$/d' $file funktioniert einwandfrei in bash Terminal unter macOS High Sierra und CentOS 6/7 Linux in einem Hochleistungs-Supercomputer-Cluster.

0
justincbagley