Ich versuche leere Zeilen mit sed 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 sollte der Code dafür sein?
Ich versuche leere Zeilen mit sed 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 sollte der Code dafür sein?
Antworten:
Möglicherweise befinden sich 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 PCRE NICHT unterstützt.)
-r
sed -i "" '/^[[:space:]]*$/d' <filename>,
^\s*$mit allen "leeren" Zeilen überein. Leer bedeutet hier, dass die Zeile keine Zeichen enthält oder dass die Zeile nur leere Zeichenfolgen enthält (z. B. Leerzeichen). Alle übereinstimmenden Zeilen werden mit dem dBefehl von sed entfernt .
Mir fehlt die awkLösung:
awk 'NF' file
Welches würde zurückkehren:
xxxxxx
yyyyyy
zzzzzz
Wie funktioniert das? Da NFfür "Anzahl der Felder" steht, haben diese leeren Zeilen 0 fiedls, so dass awk 0 zu False auswertet und keine Zeile gedruckt wird; Wenn jedoch mindestens ein Feld vorhanden ist, lautet die Auswertung True und führt awkdie Standardaktion aus: Drucken Sie die aktuelle Zeile.
$ time (topic companies <data.tpx | awk 'NF' - | awk -f dialog_menu.awk -) real 0m0.006s user 0m0.000s sys 0m0.008s $ time (topic companies <data.tpx | gsed '/^\s*$/d' | awk -f dialog_menu.awk -) real 0m0.014s user 0m0.002s sys 0m0.006s Würdest du eine raffinierte Möglichkeit kennen, dies in ein awk-Skript wie z. B. ein Muster aufzunehmen? awk '/ mypattern / {do stuff ...}'
awk 'NF {do stuff...}'.
sed '/^$/d'sollte in Ordnung sein, erwarten Sie, die Datei an Ort und Stelle zu ändern? Wenn ja, sollten Sie die -iFlagge verwenden.
Vielleicht sind diese Zeilen nicht leer. Wenn dies der Fall ist, schauen Sie sich diese Frage an. Entfernen Sie leere Zeilen aus txtfiles, entfernen Sie Leerzeichen vom Anfang und Ende der Zeile. Ich glaube, das ist es, was Sie erreichen möchten .
sed -i '/^$/d'ist eine Möglichkeit, es zu tun.
[]sollten jedoch nicht in einem Klammerausdruck maskiert werden, sodass der Code hier nicht korrekt ist für \[\[:space:\]\]oder \[ \t\]- sollte [[:space:]]und sein [ \t].
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
cat, grepnimmt auch Dateien:grep . file.txt
grep '\S'ist definitiv nicht tragbar. Wenn Sie haben grep -P, können Sie verwenden, grep -P '\S'aber es wird auch nicht auf allen Plattformen unterstützt.
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 ^$
Mit Hilfe der akzeptierten Antwort hier und die akzeptierten Antwort oben, habe ich 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
Dies funktioniert auch in awk.
awk '!/^$/' file
xxxxxx
yyyyyy
zzzzzz
Sie sehen höchstwahrscheinlich das unerwartete Verhalten, weil Ihre Textdatei unter Windows erstellt wurde, sodass die Zeilenende-Sequenz lautet \r\n. Sie können dos2unix verwenden, um es in eine Textdatei im UNIX-Stil zu konvertieren, bevor Sie sed ausführen oder verwenden
sed -r "/^\r?$/d"
um Leerzeilen zu entfernen, unabhängig davon, ob der Wagenrücklauf vorhanden ist oder nicht.
-rFlagge und ist es möglich, sie zu kombinieren -i, um die Datei direkt zu ändern und das Drucken auf dem Bildschirm zu vermeiden. Darüber hinaus denke ich, dass dieser Befehl auch funktionieren würde alssed -r "/^\r$/d"
Eine weitere Option , ohne sed, awk, perl, usw.
strings $file > $output
Zeichenfolgen - Drucken Sie die Zeichenfolgen druckbarer Zeichen in Dateien.
stringsstatt string?
Meine bashspezifische Antwort lautet, die Verwendung des perlSubstitutionsoperators mit dem globalen Musterflag gwie folgt zu empfehlen :
$ perl -pe s'/^\n|^[\ ]*\n//g' $file
xxxxxx
yyyyyy
zzzzzz
Diese Antwort veranschaulicht die Berücksichtigung, ob die leeren Zeilen Leerzeichen enthalten ( [\ ]*), und die Verwendung |zum Trennen mehrerer Suchbegriffe / Felder. Getestet auf macOS High Sierra und CentOS 6/7.
Zu Ihrer Information, der ursprüngliche Code des OP sed '/^$/d' $filefunktioniert in bashTerminal unter macOS High Sierra und CentOS 6/7 Linux in einem Hochleistungs-Supercomputing-Cluster einwandfrei.
Für mich mit FreeBSD 10.1 mit sed funktionierte nur diese Lösung:
sed -e '/^[ ]*$/d' "testfile"
Im Inneren []befinden sich Leerzeichen und Tabulatorsymbole.
Testdatei enthält:
fffffff next 1 tabline ffffffffffff
ffffffff next 1 Space line ffffffffffff
ffffffff empty 1 lines ffffffffffff
============ EOF =============