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:Eine kürzere Version, die ERE verwendet, zum Beispiel mit gnu sed:
(Beachten Sie, dass sed PCRE NICHT unterstützt.)
quelle
-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 demd
Befehl von sed entfernt .Mir fehlt die
awk
Lösung:Welches würde zurückkehren:
Wie funktioniert das? Da
NF
fü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ührtawk
die Standardaktion aus: Drucken Sie die aktuelle Zeile.quelle
$ 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-i
Flagge 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 .
quelle
sed -i '/^$/d'
ist eine Möglichkeit, es zu tun.sed
'/^[[:space:]]*$/d'
'/^\s*$/d'
'/^$/d'
-n '/^\s*$/!p'
grep
.
-v '^$'
-v '^\s*$'
-v '^[[:space:]]*$'
awk
/./
'NF'
'length'
'/^[ \t]*$/ {next;} {print}'
'!/^[ \t]*$/'
quelle
[]
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:
Wenn Sie auch alle Leerzeichen ignorieren müssen, versuchen Sie Folgendes:
Beispiel:
Ausgänge
quelle
cat
,grep
nimmt auch Dateien:grep . file.txt
grep '\S'
ist definitiv nicht tragbar. Wenn Sie habengrep -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 Sieunbuffer apt search foo | grep .
mitunbuffer apt search foo | grep -v ^$
Mit Hilfe der akzeptierten Antwort hier und die akzeptierten Antwort oben, habe ich verwendet:
Dies deckt alle Grundlagen ab und funktioniert perfekt für meine Bedürfnisse. Ein großes Lob an die Originalposter @Kent und @kev
quelle
Sie können sagen:
quelle
print all lines except the empty one(s)
und ruhig seinSie können so etwas auch mit "grep" machen:
quelle
Dies funktioniert auch in awk.
quelle
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 verwendenum Leerzeilen zu entfernen, unabhängig davon, ob der Wagenrücklauf vorhanden ist oder nicht.
quelle
-r
Flagge 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.Zeichenfolgen - Drucken Sie die Zeichenfolgen druckbarer Zeichen in Dateien.
quelle
strings
stattstring
?Meine
bash
spezifische Antwort lautet, die Verwendung desperl
Substitutionsoperators mit dem globalen Musterflagg
wie folgt zu empfehlen :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' $file
funktioniert inbash
Terminal unter macOS High Sierra und CentOS 6/7 Linux in einem Hochleistungs-Supercomputing-Cluster einwandfrei.quelle
Für mich mit FreeBSD 10.1 mit sed funktionierte nur diese Lösung:
Im Inneren
[]
befinden sich Leerzeichen und Tabulatorsymbole.Testdatei enthält:
quelle