Einführung
Bei der Arbeit mit Textdateien unter Linux müssen Sie häufig automatische Änderungen vornehmen, ohne einen interaktiven Texteditor zu öffnen. Beispielsweise möchten Sie möglicherweise eine Kopfzeile aus einer CSV-Datei entfernen, leere Zeilen löschen oder einen bestimmten Zeilenbereich aus einer Protokolldatei extrahieren.
Für solche Aufgaben verwenden wir sed (Stream-Editor).
sed ist ein leistungsfähiger, nicht interaktiver Texteditor. Er liest Eingaben aus einer Datei oder einer Pipe, führt für jede Zeile eine Operation aus und gibt das Ergebnis aus. Dieses Modell – „lesen, umwandeln, ausgeben“ – ist ein klassischer Unix-Ansatz und eignet sich besonders gut für Pipelines.
Dieses Modell erklärt die Bezeichnung Stream-Editor. sed ist für die Verarbeitung fortlaufender Textdaten ausgelegt, nicht nur für Dateien, die wie in einem Vollbildeditor geöffnet werden. Deshalb lässt es sich so natürlich in Shell-Pipelines und Automatisierungsskripte integrieren.
In diesem Lab lernen Sie:
- Zeilen löschen (
d): Unerwünschte Kopfzeilen oder Kommentare entfernen. - Leere Zeilen entfernen: Reguläre Ausdrücke verwenden, um Leerzeilen herauszufiltern.
- Text einfügen (
i): Neue Zeilen in die Datei einfügen. - Zeilen ausgeben (
p): Bestimmte Zeilenbereiche extrahieren.
Zeilen löschen
Sehen Sie sich zunächst unsere Beispieldatei an.
cat /home/labex/project/data.csv
Sie sehen, dass die Datei am Anfang zwei Kommentarzeilen enthält, die mit # beginnen. Diese Zeilen sollen entfernt werden.
Zum Löschen von Zeilen verwenden Sie in sed den Befehl d.
1dlöscht Zeile 1.1,2dlöscht die Zeilen 1 bis 2.
Die Adressierung von Zeilen über ihre Nummer ist eines der grundlegenden Konzepte von sed. Eine Adresse legt fest, auf welche Zeile oder welchen Zeilenbereich ein Befehl angewendet wird. Der Bearbeitungsbefehl bestimmt, was mit diesen Zeilen geschieht.
Führen Sie den folgenden Befehl aus, um das Löschen zunächst anzuzeigen, ohne die Datei zu ändern:
sed '1,2d' data.csv
Die Ausgabe zeigt den Dateiinhalt ohne die ersten beiden Zeilen. Überprüfen Sie den Dateiinhalt anschließend erneut:
cat data.csv
Die Zeilen sind weiterhin vorhanden. Standardmäßig sendet sed seine Ausgabe an den Bildschirm (die Standardausgabe) und ändert die ursprüngliche Datei nicht. Das ist eine Sicherheitsfunktion.
Um die Änderungen direkt in der Datei anzuwenden („in place“), verwenden Sie die Option -i:
sed -i '1,2d' data.csv
Überprüfen Sie die Änderungen:
cat data.csv
Die Kopfzeilen wurden nun dauerhaft entfernt.
Leere Zeilen entfernen
Unsere Datei enthält noch leere Zeilen, die die Struktur der Daten unterbrechen. In verarbeiteten Datendateien sind solche Zeilen normalerweise nicht erwünscht.
Um sie zu entfernen, kombinieren wir den Löschbefehl (d) mit einem regulären Ausdruck (Regex).
^steht für den Anfang einer Zeile.$steht für das Ende einer Zeile.^$trifft auf eine Zeile zu, die direkt nach dem Anfang endet, also auf eine leere Zeile.
Dies ist ein gutes Beispiel dafür, wie sed zwei Ebenen kombiniert: ein Adressmuster und eine Bearbeitungsaktion. Das Muster /^$/ wählt passende Zeilen aus, und d löscht diese ausgewählten Zeilen.
Der Befehl /^$/d weist sed an, „jede Zeile zu löschen, die auf das Muster für eine leere Zeile passt“.
Führen Sie den Befehl aus, um die leeren Zeilen direkt in der Datei zu entfernen:
sed -i '/^$/d' data.csv
Überprüfen Sie das Ergebnis:
cat data.csv
Die Datei sollte nun eine kompakte Datenliste ohne Lücken enthalten.
Text einfügen
Nachdem die unnötigen Kommentare entfernt wurden, möchten wir eine passende Klassifikationskopfzeile in die Datei einfügen.
Der Befehl i (Insert) fügt Text vor der angegebenen Zeile ein.
1i Textfügt „Text“ vor Zeile 1 ein.
Der Befehl a (Append) fügt Text nach der angegebenen Zeile ein.
1a Textfügt „Text“ nach Zeile 1 ein.
Zusammen mit dem Löschen und Ersetzen zeigen Befehle wie i und a, dass sed nicht auf das Ersetzen von Text beschränkt ist. Der Stream kann verändert werden, indem Zeilen entfernt, hinzugefügt oder ausgewählt werden, während sie verarbeitet werden.
Führen Sie den folgenden Befehl aus, um „Company Confidential“ ganz am Anfang der Datei einzufügen:
sed -i '1i Company Confidential' data.csv
Überprüfen Sie den Dateiinhalt:
cat data.csv
Die neue Zeile wurde am Anfang eingefügt, sodass alle anderen Zeilen nach unten verschoben wurden.
Bestimmte Zeilen ausgeben
Manchmal möchten Sie die Datei nicht bearbeiten, sondern nur bestimmte Zeilen extrahieren. sed kann dabei wie eine leistungsfähigere Variante von head oder tail verwendet werden.
Standardmäßig gibt sed jede verarbeitete Zeile aus. Um nur bestimmte Zeilen auszugeben, gehen Sie so vor:
- Verwenden Sie die Option
-n, um die automatische Ausgabe zu unterdrücken. - Verwenden Sie den Befehl
p, um bestimmte Zeilen ausdrücklich auszugeben.
Ohne -n würde sed automatisch jede Zeile ausgeben und die ausgewählten Zeilen beim Ausführen von p ein zweites Mal ausgeben. Das kann für Anfänger verwirrend sein. Mit -n deaktivieren Sie das Standardverhalten, sodass der Befehl nur die von Ihnen ausgewählten Zeilen ausgibt.
So geben Sie die Zeilen 5 bis 10 aus:
sed -n '5,10p' data.csv
Um nur die letzte Zeile auszugeben, verwenden Sie das Symbol $ für das Ende der Datei:
sed -n '$p' data.csv
Das ist besonders nützlich bei der Analyse großer Protokolldateien, wenn Sie nur einen bestimmten Abschnitt anzeigen möchten.
Zusammenfassung
In diesem Lab haben Sie die Grundlagen der Stream-Bearbeitung mit sed gelernt:
- Löschen (
d): Bestimmte Zeilen (1,2d) oder Zeilen löschen, die auf ein Muster passen (/^$/d). - Einfügen (
i): Text an bestimmten Stellen in den Dateistream einfügen. - Ausgeben (
-n ... p): Die Standardausgabe unterdrücken und nur ausgewählte Zeilen ausgeben. - Bearbeitung direkt in der Datei (
-i): Die Datei direkt ändern, statt den Inhalt nur auf dem Bildschirm auszugeben.
sed ist ein unverzichtbares Werkzeug für die automatisierte Textverarbeitung und wird häufig in Shell-Skripten für das Konfigurationsmanagement und die Protokollanalyse eingesetzt.



