Intelligente Lösungen
in neuer Dimension

SED: Trennzeichen bei Suchen und Ersetzen

Ich verwende gelegentlich das Werkzeug SED um Dateien mittels Skripten zu modifizieren. Beispielsweise kann ich mit sed -i 's/Ulrich/Uli/g' mein-profil.txt in der Datei “mein-profil.txt” global die Zeichenkette “Ulrich” durch “Uli” ersetzen. Etwas komplizierter wird’s, wenn ich “/etc/passwd” durch “/my-etc/hidden-passwd” ersetzen möchte, weil “/” eine Sonderrolle einnimmt zur Begrenzung der Zeichenketten.

Suchen und Ersetzen

Bei Suchen und Ersetzen mit “s” kann man einfach ein anderes Zeichen für die “Sonderrolle” wählen, wenn der Schrägstrich bei Suchen und/oder ersetzen enthalten ist. Das gewählte Zeichen darf natürlich auch nicht enthalten sein:

  • Standardfall: sed -i 's/Ulrich/Uli/g' mein-profil.txt
  • Schrägstrich bei Suchen und/oder Ersetzen: sed -i 's!/etc/passwd!/my-etc/hidden-passwd!g' mein-skript.sh

Bereiche

Bei der Angabe von Bereichen ist die Vorgabe eines anderen Zeichens etwas komplizierter. Bereiche beginnen üblicherweise ja direkt mit dem Schrägstrich. Beispiele:

  • 1,/--END/ … alles von Zeile 1 bis “—END”
  • /--BEGIN/,/--END/ … alles zwischen den Zeilen mit “—BEGIN” und “—END”

Bei Bereichen kann ein anderes Zeichen für die Suche vorgegeben werden, indem ein Rückschrägstrich \ vorangestellt wird, also:

  • 1,\!--END! … alles von Zeile 1 bis “—END”
  • \!--BEGIN!,/--END/ … alles zwischen den Zeilen mit “—BEGIN” und “—END”
  • \!--BEGIN!,\!--END! … alles zwischen den Zeilen mit “—BEGIN” und “—END”

Anwendung beim Löschen von Bereichen:

  • Standardfall: sed -e '/--BEGIN/,/--END/d' beispiel-datei-1.txt –> Zwei Zeilen: 1 und 3
  • Standardfall: sed -e '\!/BEGIN!,\!/END!d' beispiel-datei-2.txt –> Zwei Zeilen: A und C

beispiel-datei-1.txt

1
2
3
4
5
1
--BEGIN
2
--END
3

beispiel-datei-2.txt

1
2
3
4
5
A
/BEGIN
B
/END
C

Änderungen

  • 2021-10-18 – Erste Version