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


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.


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.


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


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"


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


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

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:

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.