Suchen und Ersetzen mit SED.

SED (Stream Editor) ist ein sehr mächtiger, aber für den ungewohnten Nutzer kryptischer, Texteditor. Mit SED kannst Du mit ca 25 Befehlen Texte manipulieren. Im Gegensatz zu anderen Editoren ist er jedoch nicht interaktiv, sondern manipuliert die Dateien anhand von Anweisungen. SED liest eine Datei Zeile für Zeile ein, prüft ob die Anweisung zutrifft und gibt die Zeile mit den veränderten Daten zurück. Im Gegensatz zum „tr“ bezieht sich der „sed“ dabei nicht nur auf ein Zeichen oder eine Position, sondern auf die gesamte Zeichenfolge. Wenn man also längere Zeichenfolgen (mindestens 2 Zeichen) ersetzen möchte, ist der Befehl SED genau das richtige Mittel:

sed ’s/suchmuster/ersatz/g’
sed ’s/suchmuster/ersatz/1’
sed ’s/suchmuster/ersatz/3’

  • s ➔ substitute – ersetzen
  • g ➔ global – in der ganzen Zeile
  • 1 ➔ das erste Auftreten in einer Zeile
  • 3 ➔ das dritte Auftreten in einer Zeile

Mit dem Parameter -r kann SED auch Suchmuster mit regulären und erweiterten Ausdrücken ersetzen. Du kannst diese Ausdrücke mit egrep ausprobieren und wenn sie funktionieren, in SED verwenden. Dazu lässt Du Dir im egrep das Ergebnis mit dem Parameter -o anzeigen. so siehst Du genau was egrep ausschneiden würde. Und das ist dann auch der Teil den SED ersetzen wird.

sed -r 's/[mM][ae][iy]j?e?r/Meier/g'

Dieser Befehl würde dafür sorgen, dass das Wort Meier nur noch in einer einzigen Schreibweise im Dokument vorhanden ist. Natürlich verändert der SED nicht das Original-Dokument sondern nur die Ausgabe auf dem Bildschirm.

Mit dem SED lassen sich z.B. sämtliche Leerzeichen die am Anfang oder Ende einer Zeile stehen entfernen:

sed -re 's/^ *//1' -e 's/ *$//1'

Das Dächchen ist der Ausdruck für Anfang der Zeile. Dann folgt ein Leerzeichen. Der anschließende Stern bedeutet, dass das Leerzeichen beliebig oft vorkommen kann. Da das zweite Feld leer ist, werden die gefundenen Leerzeichen durch nichts ersetzt. Der Parameter -e ermöglicht mehrere SED-Anweisungen in einem Befehl unterzubringen. Im zweiten Kommando werden die Leerzeichen am Zeilenende entfernt.

Für viele Probleme gibt es unterschiedliche Herangehensweisen, die aber alle Erfolg haben können. Es spielt keine Rolle ob Du – wie in diesem Beispiel – führende Leerzeichen nun mit dem SED oder mit dem AWK entfernst. Wichtig ist, dass Du sie entfernt bekommst, wenn sie Dich bei der Aufbereitung der Daten stören.

Ist es erforderlich einen Teil des Suchbegriffs zu erhalten, muß dieser Teilbereich in eine runde Klammer eingschlossen werden. Die Klammern können dann der Reihenfolge nach mit \1 für die erste Klammer \2 für die zweite Klammer usw. angesprochen werden.

$ echo Test für sed | sed -r 's/(Test für) (sed)/\1 GNU \2/g'
Test für GNU sed

Übrigens ist der / nicht Teil der Syntax. Das Zeichen, welches nach dem s kommt, wird als Trenner für den Befehl genutzt. Du kannst den SED auch so schreiben:

sed -r 's|(Test für) (sed)|\1 GNU \2|g'

In meiner Youtube-Playlist „Datenaufbereitung in der Bash“ habe ich u.a. in den Videos #10, 11 und 25 Anwendungsbeispiele für den SED gezeigt.