Ich habe es grep -v '^$'
unter Linux versucht und das hat nicht funktioniert. Diese Datei stammt aus einem Windows-Dateisystem.
Ich habe es grep -v '^$'
unter Linux versucht und das hat nicht funktioniert. Diese Datei stammt aus einem Windows-Dateisystem.
Antworten:
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.
grep . filename.txt
Verwenden:
$ dos2unix file
$ grep -v "^$" file
Oder einfach nur awk:
awk 'NF' file
Wenn Sie nicht über dos2unix verfügen, können Sie Tools wie tr verwenden :
tr -d '\r' < "$file" > t ; mv t "$file"
awk
.
grep -v "^[[:space:]]*$"
The -v makes it print lines that do not completely match
===Each part explained===
^ match start of line
[[:space:]] match whitespace- spaces, tabs, carriage returns, etc.
* previous match (whitespace) may exist from 0 to infinite times
$ match end of line
Ausführen des Code-
$ echo "
> hello
>
> ok" |
> grep -v "^[[:space:]]*$"
hello
ok
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
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:
egrep -v "^(\r?\n)?$" filename.txt
Wenn Sie Sequenzen mit mehreren Leerzeilen in einer Zeile haben und nur eine Leerzeile pro Sequenz möchten, versuchen Sie es
grep -v "unwantedThing" foo.txt | cat -s
cat -s
unterdrückt wiederholte leere Ausgabezeilen.
Ihre Ausgabe würde von gehen
match1
match2
zu
match1
match2
Die drei Leerzeilen in der ursprünglichen Ausgabe würden komprimiert oder zu einer Leerzeile "zusammengedrückt".
Das gleiche wie die vorherigen Antworten:
grep -v -e '^$' foo.txt
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.
-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 Fall sed -i
wäre das richtige Werkzeug.
Ich habe mich sehr bemüht, aber das scheint zu funktionieren (vorausgesetzt, \r
Sie beißen hier):
printf "\r" | egrep -xv "[[:space:]]*"
Verwenden von Perl:
perl -ne 'print if /\S/'
\S
bedeutet, dass nicht leere Zeichen übereinstimmen.
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
Verwenden:
grep pattern filename.txt | uniq
uniq
reduziert benachbarte Leerzeilen auf nur eine Leerzeile, entfernt sie jedoch nicht vollständig. Trotzdem versuche ich gerne, es so zu benutzen uniq
. 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.
[root@localhost ~]# cat /etc/sudoers | egrep -v '^(#|$)'
Defaults requiretty
Defaults !visiblepw
Defaults always_set_home
Defaults env_reset
Defaults env_keep = "COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR
LS_COLORS"
root ALL=(ALL) ALL
%wheel ALL=(ALL) ALL
stack ALL=(ALL) NOPASSWD: ALL
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:
awk 'NF' foo.txt
Da diese Frage jedoch für die Verwendung von grep bestimmt ist, werde ich Folgendes beantworten:
grep -v '^ *$' foo.txt
Hinweis : Das Leerzeichen zwischen ^ und *.
Oder Sie können die \ s verwenden, um Leerzeichen wie folgt darzustellen:
grep -v '^\s*$' foo.txt