2010-08-08 14 views

Antwort

199

Versuchen Sie Folgendes:

grep -v -e '^$' foo.txt 

Die -e Option ermöglicht passende Regex Muster.

Die einfache Anführungszeichen um ^$ macht es für Cshell arbeiten. Andere Shells sind entweder mit einfachen oder doppelten Anführungszeichen zufrieden.

UPDATE: Dies funktioniert für mich für eine Datei mit leeren Zeilen oder "alle Leerzeichen" (wie Windows-Zeilen mit "\ r \ n" Stil Zeilenenden), während das obige nur Dateien mit leeren Zeilen und Unix entfernt Stil Zeilenende:

grep -v -e '^[[:space:]]*$' foo.txt 
+0

Es ist immer noch leere Zeilen zeigt. –

+0

Siehe Update auf die Frage. – ars

+0

Ja, das funktioniert. Es funktioniert auch mit Grep. –

1

ich ziehe egrep verwenden, obwohl in meinem Test mit einer echten Datei mit leerer Linie Ihres Ansatz gut funktionierte (wenn auch ohne Anführungszeichen in meinem Test). Das funktionierte auch:

egrep -v "^(\r?\n)?$" filename.txt 
+0

Versuchte das. Leerzeilen werden immer noch angezeigt. Könnte das daran liegen, dass die Datei in Windows erstellt wurde? –

1

Versuchte hart, aber dies scheint zu funktionieren (\r unter der Annahme Sie hier beißen)

printf "\r" | egrep -xv "[[:space:]]*" 
+0

Das funktioniert, wenn ich den ersten Teil durch die Ausgabe aus der Datei ersetzen. –

22
$ dos2unix file 
$ grep -v "^$" file 

Oder nur awk einfach

awk 'NF' file 

Wenn Sie don Haben Sie dos2unix, dann können Sie Werkzeuge wie tr

verwenden
tr -d '\r' < "$file" > t ; mv t "$file" 
+0

Kann das Programm dos2unix nicht finden. Ist das für Windows? Der Befehl ask funktioniert auch nicht. –

+0

fragen? Nein, das ist "awk". – iconoclast

+0

Ein guter Punkt bei der Umwandlung in Zeilenenden nach UNIX-Art, sonst funktionieren reguläre Ausdrücke möglicherweise nicht wie erwartet. Nichts funktionierte für mich, bis ich die Zeilenenden umwandelte. –

12
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 

die Code- Lauf

$ echo " 
> hello 
>  
> ok" | 
> grep -v "^[[:space:]]*$" 
hello 
ok 

Um mehr über zu verstehen, wie/warum das funktioniert, empfehle ich zu regulären Ausdrücken zu lesen auf. http://www.regular-expressions.info/tutorial.html

+2

Wie und warum funktioniert das? Ihre Antwort wäre viel besser, wenn Sie es erklären könnten. Zum Beispiel entspricht Ihr regulärer Ausdruck dem Anfang des Strings dann einem oder mehreren Leerzeichen, die den POSIX-Standard verwenden, dann das Ende des Strings, d. H. Mit grep -v entfernt er alle Zeilen, die nur Leerzeichen sind. Recht? Was passiert, wenn keine Leerzeichen vorhanden sind? es ist einfach ein Newline-Charakter? – Ben

+0

Wie mein Beispiel zeigt, wird sogar nur eine leere Zeile entfernt (die erste Zeile). Ich habe mehr Informationen hinzugefügt, also hoffentlich hilft das. :) – Sepero

0

grep pattern Dateiname.txt |

uniq
+0

'uniq' reduziert angrenzende Leerzeilen auf nur eine Leerzeile, entfernt sie aber nicht vollständig. Trotzdem versuche ich, 'uniq' so zu benutzen. Wenn Sie zuerst sortieren, werden alle Leerzeilen effektiv entfernt - es bleibt nur eine übrig, aber die Reihenfolge der Zeilen kann möglicherweise nicht akzeptiert werden. –

+0

Guter Punkt. Dies wird auch wiederholte Linien chomp. Ich denke, meine Lösung führt Fehler ein. – baitisj

0
awk 'NF' file-with-blank-lines > file-with-no-blank-lines 
0

Mit Perl:

perl -ne 'print if /\S/' 

\S bedeutet Spiel nicht leere Zeichen.

0

Hier ist eine andere Möglichkeit, die weißen Linien und Linien zu entfernen, die mit # beginnen. Ich denke, das ist sehr nützlich, um Konfigurationsdateien zu lesen.

[[email protected] ~]# 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 
1

Wie oben Antworten

grep -v -e '^$' foo.txt 

Hier bedeutet grep -e erweiterte Version von grep. '^ $' bedeutet, dass zwischen^(Anfang der Zeile) und $ (Zeilenende) kein Zeichen steht. '^' und '$' sind Regex-Zeichen.

Also wird der Befehl grep -v alle Zeilen ausgeben, die nicht mit diesem Muster übereinstimmen (keine Zeichen zwischen^und $).

Auf diese Weise werden leere Leerzeilen eliminiert

23

Halten Sie es einfach.

grep . filename.txt 
+0

das gibt mir alle Zeilen in der Datei –

+1

@ LưuVĩnhPhúc Es sollte alle Zeilen in der Datei außer leere Zeilen ausgeben. –

+0

Dies funktioniert für mich auf Dateien von einem Linux-basierten System, aber nicht auf Dateien von Windows. Vermutlich wegen Windows-Zeilenende-Zeichen. – ocertat

1

Wenn Sie Sequenzen von mehreren Leerzeilen in einer Reihe haben, und würde nur eine leere Zeile pro Sequenz, versuchen

grep -v "unwantedThing" foo.txt | cat -s 

cat -s leer Ausgangsleitungen wiederholt unterdrückt.

Ihr Ausgang würde von

match1 



match2 

zu

match1 

match2 

Die drei Leerzeilen in der ursprünglichen Ausgabe komprimiert oder würde in eine leere Zeile „gequetscht“.

0

egrep -v "^ \ s \ s +"

egrep bereits tun regex und die \ s weißen Raum.

Das + dupliziert das aktuelle Muster.

Die^ist für den Start

4

Sie leere Zeile mit diesem Beispiel entfernen:

grep . filename.txt 
Verwandte Themen