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
Antworten:
Diese Sed-Linie sollte den Trick machen:
Dies
-i
bedeutet, dass die Datei direkt bearbeitet wird.quelle
\s*
ist die gleiche Lösung von Stackoverflow Frage gegebenbad flag in substitute command: 'e'
grep
Eine einfache Lösung ist die Verwendung des folgenden Befehls
grep
( GNU oder BSD ).Entfernen Sie Leerzeilen (ohne Leerzeichen).
Entfernen Sie vollständig leere Zeilen (einschließlich Zeilen mit Leerzeichen).
Hinweis: Wenn Sie unerwünschte Farben erhalten, bedeutet dies, dass Sie
grep
Aliasnamen habengrep --color=auto
(überprüfen durchtype grep
). In diesem Fall können Sie--color=none
Parameter 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:
oder einschließlich Zeilen mit Leerzeichen:
Siehe auch:
sed
: Leerzeilen mit sed löschenawk
: Leerzeilen mit awk entfernenquelle
grep .
scheint die einfachste Lösung zu sein.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 ^$
grep
Alias vorliegtgrep --color=auto
(check by :)type grep
. Sie können es als Parameter ausführen\grep
oder verwenden--color=none
.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
)grep .
passt auf Zeilen, die nur Leerzeichen enthalten, was laut OP nicht erwünscht ist.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.quelle
Sie können die Option -v mit grep verwenden, um die übereinstimmenden Leerzeilen zu entfernen.
So was
quelle
-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.grep -Ev '^#|^$' file.txt
Hier ist eine
awk
Lösung:Bei Awk
NF
nur auf nicht leere Zeilen setzen. Wenn diese Bedingung zutrifft, wird standardmäßig die gesamte Zeile gedruckt.quelle
Um leere Zeilen zu entfernen, können Sie die neuen Zeilenwiederholungen wie folgt zusammenpressen
tr
:quelle
xargs, wenn es Ihnen nichts ausmacht, führende Leerzeichen zu entfernen
quelle
Ex / Vim
Hier ist die Methode mit dem
ex
Editor (Teil von Vim):Für mehrere Dateien (direkt bearbeiten):
Hinweis: Der
:bufdo
Befehl ist nicht POSIX .Ohne die Datei zu ändern (einfach auf der Standardausgabe drucken):
quelle
Für mich @ martigin-heemels Befehl war werfen Fehler dies behoben (dh ein Dummy-Parameter zu i),
sed -i '' '/^$/d' file.txt
quelle
Der wahrscheinlich einfachste Weg, leere Zeilen (ohne Leerzeichen) zu entfernen, ist
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.
quelle