Ich habe es grep -v '^$'
unter Linux versucht und das hat nicht funktioniert. Diese Datei stammt aus einem Windows-Dateisystem.
164
Versuche Folgendes:
grep -v -e '^$' foo.txt
Die -e
Option ermöglicht Regex-Muster für den Abgleich.
Die einfachen Anführungszeichen ^$
machen es für Cshell. Andere Muscheln freuen sich über einfache oder doppelte Anführungszeichen.
UPDATE: Dies funktioniert bei mir für eine Datei mit Leerzeilen oder "allen Leerzeichen" (z. B. Windows-Zeilen mit Zeilenenden im Stil "\ r \ n"), während oben nur Dateien mit Leerzeilen und Zeilenenden im Unix-Stil entfernt werden:
grep -v -e '^[[:space:]]*$' foo.txt
grep -E -v
, alles danach-e
wird als Muster interpretiert.grep -v -e '^[[:space:]]*$' -e '^#' file
Sie erhalten alle nicht leeren Zeilen ohne Kommentar in einer Skript- oder Konfigurationsdatei (oder einem beliebigen Dateityp, der das Hash-Zeichen für Kommentare verwendet).-e
Option ermöglicht Regex-Muster für den Abgleich." Das ist sehr irreführend .-e
ist eine (POSIX-) Definition für:This can be used to specify multiple search patterns, or to protect a pattern beginning with a hyphen (-).
(aus dem Handbuch ). Grep erwartet standardmäßig bereits einen (einfachen) regulären Ausdruck. Für dieses Muster können Sie-e
ganz weglassen :grep -v '^[[:space:]]*$' foo.txt
.Halte es einfach.
quelle
Verwenden:
Oder einfach nur awk:
Wenn Sie nicht über dos2unix verfügen, können Sie Tools wie tr verwenden :
quelle
awk
.Ausführen des Code-
Um mehr darüber zu erfahren, wie / warum dies funktioniert, empfehle ich, sich über reguläre Ausdrücke zu informieren. http://www.regular-expressions.info/tutorial.html
quelle
Ich bevorzuge die Verwendung
egrep
, obwohl Ihr Ansatz in meinem Test mit einer echten Datei mit Leerzeichen einwandfrei funktioniert hat (allerdings ohne Anführungszeichen in meinem Test). Das hat auch funktioniert:quelle
Wenn Sie Sequenzen mit mehreren Leerzeilen in einer Zeile haben und nur eine Leerzeile pro Sequenz möchten, versuchen Sie es
cat -s
unterdrückt wiederholte leere Ausgabezeilen.Ihre Ausgabe würde von gehen
zu
Die drei Leerzeilen in der ursprünglichen Ausgabe würden komprimiert oder zu einer Leerzeile "zusammengedrückt".
quelle
quelle
Das gleiche wie die vorherigen Antworten:
Hier
grep -e
bedeutet die erweiterte Version von grep . '^ $' bedeutet, dass zwischen ^ (Zeilenanfang) und $ (Zeilenende) kein Zeichen steht. '^' und '$' sind Regex-Zeichen.Der Befehl
grep -v
druckt also alle Zeilen, die nicht mit diesem Muster übereinstimmen (keine Zeichen zwischen ^ und $).Auf diese Weise werden leere Leerzeilen entfernt.
quelle
-e
bedeutet nicht "die erweiterte Version von grep", vielleicht sind Sie verwirrt mit-E
? Das Handbuch sagt deutlich, dass-e
nur explizit gesagt wird, dass ein Muster folgt. Da das Muster nicht mit einem Bindestrich beginnt und Sie ohnehin nur ein Muster definieren, können Sie es auch weglassen, da grep standardmäßig ein Regex-Muster erwartet:grep -v '^$' foo.txt
(Keine Notwendigkeit für eine erweiterte Regex-Funktionalität). Erwähnenswert ist auch, dass dadurch nicht die Leerzeilen in der Datei entfernt werden, sondern nur die, die durch die Ausgabe geleitet werden. Für diesen Fallsed -i
wäre das richtige Werkzeug.Ich habe mich sehr bemüht, aber das scheint zu funktionieren (vorausgesetzt,
\r
Sie beißen hier):quelle
Verwenden von Perl:
\S
bedeutet, dass nicht leere Zeichen übereinstimmen.quelle
egrep -v "^ \ s \ s +"
egrep macht bereits Regex und das \ s ist ein Leerraum.
Das + dupliziert das aktuelle Muster.
Das ^ ist für den Anfang
quelle
Verwenden:
quelle
uniq
reduziert benachbarte Leerzeilen auf nur eine Leerzeile, entfernt sie jedoch nicht vollständig. Trotzdem versuche ich gerne, es so zu benutzenuniq
. Wenn Sie zuerst sortieren, werden effektiv alle Leerzeilen entfernt, sodass nur eine übrig bleibt. Eine Neuanordnung der Zeilenreihenfolge ist jedoch möglicherweise nicht akzeptabel.Hier ist eine andere Möglichkeit, die weißen Linien und Linien, die mit dem
#
Zeichen beginnen, zu entfernen . Ich denke, dies ist sehr nützlich, um Konfigurationsdateien zu lesen.quelle
Es ist wahr, dass die Verwendung von grep -v -e '^ $' funktionieren kann, es werden jedoch keine Leerzeilen entfernt, die 1 oder mehr Leerzeichen enthalten . Ich fand, dass die einfachste und einfachste Antwort zum Entfernen von Leerzeilen die Verwendung von awk ist . Das Folgende ist ein bisschen modifiziert von den Awk-Jungs oben:
Da diese Frage jedoch für die Verwendung von grep bestimmt ist, werde ich Folgendes beantworten:
Hinweis : Das Leerzeichen zwischen ^ und *.
Oder Sie können die \ s verwenden, um Leerzeichen wie folgt darzustellen:
quelle