HOWTO · Bash
Leerzeilen in Bash entfernen
In diesem Tutorial wird erläutert, wie Sie leere Zeilen in Bash entfernen.
Auf dieser Seite
Enthält eine Textdatei unerwünschte Leerzeilen, können Sie sie beim Anzeigen mit sed, grep oder awk herausfiltern. Jeder der folgenden Befehle schreibt die beibehaltenen Zeilen in die Standardausgabe und lässt die Quelldatei unverändert. Dabei handelt es sich um Kommandozeilenprogramme, die aus Bash oder einer anderen POSIX-ähnlichen Shell verwendet werden, nicht um Bash-Schlüsselwörter oder integrierte Bash-Befehle.
Wählen Sie sed für eine Stream-Bearbeitung, grep für eine kompakte umgekehrte Suche oder awk, wenn der Filter Teil eines größeren Skripts zur Datensatzverarbeitung werden soll. Um das Ergebnis zu speichern, leiten Sie die Ausgabe in eine separate Datei um und prüfen Sie diese, bevor Sie die Quelldatei ersetzen. Die Dienstprogramme sind in Bash/Linux und anderen POSIX-ähnlichen Kommandozeilenumgebungen allgemein verfügbar.
Bash-Eingabedatei vorbereiten
Für die Befehlsbeispiele enthält 1_Test.txt vier Textzeilen, zwischen der zweiten und dritten Zeile befindet sich eine Leerzeile. Das folgende vollständige Skript erstellt diese Datei in einem temporären Verzeichnis, wendet den Filter an und gibt das Ergebnis aus. Nach Abschluss des Befehls entfernt es die temporären Dateien. Der Ausgabe-Block zeigt die vier beibehaltenen Zeilen.
temp_dir="$(mktemp -d)"
sample_file="$temp_dir/1_Test.txt"
printf '%s\n' \
'This is the first line.' \
'This is the second line.' \
'' \
'This is the third line.' \
'This is the fourth line.' > "$sample_file"
sed '/^[[:space:]]*$/d' "$sample_file"
rm -f "$sample_file"
rmdir "$temp_dir"
This is the first line.
This is the second line.
This is the third line.
This is the fourth line.
Damit werden Leerzeilen aus der angezeigten Ausgabe entfernt, während die vier nicht leeren Zeilen erhalten bleiben.
Der Ausdruck ^[[:space:]]*$ stimmt mit einer Zeile vom Anfang bis zum Ende überein, wenn sie ausschließlich aus Leerraum besteht. Deshalb verarbeiten dieselben Befehle sowohl Zeilen ohne Zeichen als auch Zeilen, die Leerzeichen oder Tabulatoren enthalten.
Zeilen mit dem Dienstprogramm sed filtern
sed behandelt /^[[:space:]]*$/d als Löschregel. Wenn das Muster übereinstimmt, entfernt d die betreffende Eingabezeile aus dem Stream, der an die Standardausgabe gesendet wird. Für die Beispieldatei führen Sie sed '/^[[:space:]]*$/d' 1_Test.txt aus.
Dieser Befehl lässt die Originaldatei unverändert. Wenn Sie eine neue bereinigte Datei benötigen, leiten Sie die Ausgabe beispielsweise mit sed '/^[[:space:]]*$/d' 1_Test.txt > cleaned.txt in einen separaten Pfad um und prüfen Sie die Datei, bevor Sie die Quelle ersetzen. Durch die Umleitung wird der gefilterte Stream gespeichert; sed liest weiterhin den ursprünglichen Pfad.
Zeilen mit dem Dienstprogramm grep filtern
grep -v kehrt die Suche um und gibt daher Zeilen aus, die nicht auf ^[[:space:]]*$ passen. Führen Sie für 1_Test.txt grep -v '^[[:space:]]*$' 1_Test.txt aus. Der reguläre Ausdruck ist derselbe wie im sed-Befehl, während -v grep anweist, die nicht passenden Zeilen beizubehalten.
Wie die sed-Variante schreibt auch grep die beibehaltenen Zeilen in die Standardausgabe und bearbeitet den Eingabepfad nicht. Das ist eine praktische Wahl, wenn lediglich Zeilen ausgeschlossen werden sollen, die auf ein bestimmtes Muster passen. Wenn Sie das Ergebnis speichern möchten, leiten Sie die Ausgabe in eine andere Datei um.
Dieses eigenständige Beispiel erstellt die Beispieldatei vor dem grep-Filter und kann daher verwendet werden, ohne auf eine vorhandene zusätzliche Datei angewiesen zu sein:
temp_dir="$(mktemp -d)"
sample_file="$temp_dir/1_Test.txt"
printf '%s\n' \
'This is the first line.' \
'This is the second line.' \
'' \
'This is the third line.' \
'This is the fourth line.' > "$sample_file"
grep -v '^[[:space:]]*$' "$sample_file"
rm -f "$sample_file"
rmdir "$temp_dir"
Zeilen mit dem Dienstprogramm awk filtern
awk gibt einen Datensatz aus, wenn seine Bedingung wahr ist. Das negierte Muster ! /^[[:space:]]*$ ist für jede Zeile wahr, die mehr als Leerraum enthält. Daher behält awk '!/^[[:space:]]*$/' 1_Test.txt die relevanten Zeilen aus 1_Test.txt bei.
Diese Form ist nützlich, wenn der Zeilenfilter Teil eines größeren Skripts zur Datensatzverarbeitung werden soll. Wie die anderen Befehle schreibt sie ausschließlich die beibehaltenen Datensätze in die Standardausgabe und ersetzt 1_Test.txt nicht. Wenn Sie eine gespeicherte Kopie benötigen, leiten Sie das Ergebnis um oder verwenden Sie einen separaten Workflow zur Dateibearbeitung.
Das folgende eigenständige Beispiel verwendet dieselbe Eingabeform mit awk und lässt den Quellpfad für spätere Befehle verfügbar:
temp_dir="$(mktemp -d)"
sample_file="$temp_dir/1_Test.txt"
printf '%s\n' \
'This is the first line.' \
'This is the second line.' \
'' \
'This is the third line.' \
'This is the fourth line.' > "$sample_file"
awk '!/^[[:space:]]*$/' "$sample_file"
rm -f "$sample_file"
rmdir "$temp_dir"