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.