Wie entferne ich Leerzeilen aus einer Datei (einschließlich Tabulatoren und Leerzeichen)?

23

Ich möchte alle leeren Zeilen aus einer Datei entfernen. Auch wenn die Zeile Leerzeichen oder Tabulatoren enthält, sollte sie ebenfalls entfernt werden.

Jamshed Ansari user3000272
quelle

Antworten:

26

Nur grepfür Nicht-Leerzeichen:

grep '[^[:blank:]]' < file.in > file.out

[:blank:]Innerhalb von Zeichenbereichen ( [...]) wird dies als POSIX-Zeichenklasse bezeichnet. Es gibt ein paar wie [:alpha:], [:digit:]... [:blank:]übereinstimmt horizontalen weißen Raum (in der POSIX locale, das sind Raum und Reiter, sondern auch in anderen Gegenden könnten es mehr sein, wie alle Unicode horizontalen Abstand Zeichen in UTF - 8 Positionen ) , während [[:space:]]Streichhölzer horizontal und vertikal wissen Leerzeichen (wie [:blank:]Pluszeichen wie vertikaler Tabulator, Formularvorschub ...).

grep '[:blank:]'

Würden die Zeilen zurück , die alle Zeichen enthalten, :, b, l, a, noder k. Zeichenklassen werden nur innerhalb [...]und ^innerhalb [...]des Satzes erkannt . Bedeutet [^[:blank:]]also jedes Zeichen außer den leeren.

Stéphane Chazelas
quelle
1
sollte es auch ein $for end of line geben?
Michael Durrant
@ MichaelDurrant Es ist nicht auf beiden Seiten verankert
Jordan
1
@MichaelDurrant. [^[:blank:]]$würde nur mit Zeilen übereinstimmen, die mit einem Nicht-Leerzeichen enden. Wir wollen Zeilen, die überall
Stéphane Chazelas
@StephaneChazelas Ich habe versucht, grep [: blank:] SOURCEFILE auch dieser Befehl funktioniert. Ich verstehe, [] ist für Charakterklasse. Kannst du mir bitte eine Vorstellung davon geben, wie es funktioniert? das schnipsel: blank: ist neu für mich.
Jamshed Ansari user3000272
Gibt es Fälle, in denen grep -E '\S'das nicht funktioniert?
Terdon
21

Hier ist eine awkLösung:

$ awk NF file

Mit awk, NFnur in nicht leeren Zeilen setzen. Wenn diese Bedingung zutrifft, wird durch die awkStandardaktion printdie gesamte Zeile gedruckt.

cuonglm
quelle
Ordentlich, dies entfernt auch Zeilen mit Leerzeichen.
wisbucky
7

Wie wäre es mit:

sed -e 's/^[[:blank:]]*$//' source_file > newfile

oder

sed -e '/^[[:blank:]]*$/d' source_file > newfile

dh

Ersetzen Sie für jede Zeile:

  • wenn es anfängt (" ^")
  • mit Leerzeichen oder Tabulatoren (" [[:blank:]]") null oder mehrmals (" *")
  • und dann ist das Ende der Zeile (" $")

Weitere Informationen zu :: blank :: und anderen Sonderzeichen finden Sie unter http://www.zytrax.com/tech/web/regex.htm#special

Michael Durrant
quelle
4
[[:space:]]enthält Registerkarten. Wenn dies nicht der Fall wäre, würde Ihre Regex fehlschlagen, wenn einem Tabulator ein Leerzeichen folgt.
Jordan
Die Hilfeseiten wctype(3)und isalpha(3)beschreiben, welche Zeichenklassen übereinstimmen.
Jordan
Möglicherweise möchten Sie den ersten entfernen, der die Frage nicht beantwortet.
Stéphane Chazelas
@MichaelDurrant kannst du bitte etwas über [[: blank:]] schreiben?
Jamshed Ansari user3000272
Info für [[: blank ::]] hinzugefügt. Stephane, warum funktioniert der erste nicht? Ich dachte // am Ende würde die Zeile ohne nichts ersetzen.
Michael Durrant
4

Sie können den sedBefehl zum Entfernen von Leerzeilen verwenden:

sed '/^$/d' in > out

Dieser Befehl löscht alle Leerzeilen aus der Datei "in"

Raghavendra
quelle
Das löscht keine Zeilen, die nur Leerzeichen und Tabulatoren enthalten, wie ausdrücklich verlangt.
Dave_Thompson_085
3

Sieht so aus, als hätte ich einen gefunden, der nicht so schnell, aber lustig ist:

| xargs -L1

Poige
quelle
1
Schöne kurze, aber es macht mehr: Entfernen Sie führende Leerzeichen und Tabulatoren.
Jringoot
Oh, es hat sich als noch leistungsfähiger erwiesen? - Nett! ;-P
poige
1
Und es schneidet Zeilen ab (Standard bei 1024 Zeichen) Siehe manpages
jringoot
Ich verliebe mich tiefer in dieses einfache Werkzeug !!! 11)
poige
0

Versuchen ex -Wege:

ex -s +'v/\S/d' -cwq test.txt

Für mehrere Dateien (direkt bearbeiten):

ex -s +'bufdo!v/\S/d' -cxa *.txt

Hinweis: Der :bufdoBefehl ist nicht POSIX .

Ohne die Datei zu ändern (einfach auf der Standardausgabe drucken):

cat test.txt | ex -s +'v/\S/d' +%p +q! /dev/stdin
Kenorb
quelle
note bufdo ist nicht POSIX pubs.opengroup.org/onlinepubs/9699919799/utilities/ex.html
Steven Penny
0

Verwenden Sie den folgenden Befehl:

grep '\S' FILE

Dadurch werden alle Zeilen einschließlich Leerzeichen oder Tabulatoren entfernt.

Andernfalls verwenden Sie zum Entfernen von Zeilen ohne Leerzeichen / Tabulatoren Folgendes:

grep . FILE

Beispielsweise:

$  printf "line1\n\nline2\n \nline3\n" > FILE
$  cat -v FILE
line1

line2

line3
$  grep '\S' FILE
line1
line2
line3
$  grep . FILE
line1
line2

line3

Siehe auch:

Kenorb
quelle