Fortgeschrittene sed-Befehle und Mustererkennung
Nachdem wir die grundlegende Ersetzung und die direkte Dateibearbeitung mit sed beherrschen, erkunden wir nun einige fortgeschrittenere Funktionen:
- Die Verwendung verschiedener Trennzeichen
- Die Angabe von Zeilenbereichen für die gezielte Bearbeitung bestimmter Zeilen
- Die Kombination mehrerer Befehle
Die Verwendung verschiedener Trennzeichen
Bisher haben wir den Schrägstrich / als Trennzeichen in unseren Ersetzbefehlen verwendet. sed ermöglicht es uns jedoch, jedes beliebige Zeichen als Trennzeichen zu nutzen. Dies ist besonders nützlich, wenn das Suchmuster oder der Ersetzungstext Schrägstriche enthält.
Erstellen wir eine Datei mit Dateipfaden:
echo "/usr/local/bin is in the PATH" > ~/project/paths.txt
echo "My config is in /etc/myapp/config.json" >> ~/project/paths.txt
Wenn wir /usr/local/bin durch /opt/bin ersetzen möchten, würde die Verwendung von Schrägstrichen verwirrend sein:
sed 's/\/usr\/local\/bin/\/opt\/bin/' ~/project/paths.txt
Stattdessen können wir ein anderes Trennzeichen wie # verwenden:
sed 's#/usr/local/bin#/opt/bin#' ~/project/paths.txt
Dies ist viel lesbarer! Die Ausgabe sollte sein:
/opt/bin is in the PATH
My config is in /etc/myapp/config.json
Andere häufige Trennzeichen sind |, : und _.
Adressierung - Die gezielte Bearbeitung bestimmter Zeilen
sed ermöglicht es uns, anzugeben, auf welche Zeilen die Ersetzung angewendet werden soll. Dies geschieht, indem wir den Befehl mit einer Adresse versehen.
Erstellen wir eine neue Datei mit nummerierten Zeilen:
echo "Line 1: This is the first line." > ~/project/numbered.txt
echo "Line 2: This is the second line." >> ~/project/numbered.txt
echo "Line 3: This is the third line." >> ~/project/numbered.txt
echo "Line 4: This is the fourth line." >> ~/project/numbered.txt
echo "Line 5: This is the fifth line." >> ~/project/numbered.txt
Um "line" nur in Zeile 3 durch "row" zu ersetzen:
sed '3 s/line/row/' ~/project/numbered.txt
Die Ausgabe sollte sein:
Line 1: This is the first line.
Line 2: This is the second line.
Line 3: This is the third row.
Line 4: This is the fourth line.
Line 5: This is the fifth line.
Wir können auch einen Bereich von Zeilen angeben. Um "line" in den Zeilen 2 bis 4 durch "row" zu ersetzen:
sed '2,4 s/line/row/' ~/project/numbered.txt
Die Ausgabe sollte sein:
Line 1: This is the first line.
Line 2: This is the second row.
Line 3: This is the third row.
Line 4: This is the fourth row.
Line 5: This is the fifth line.
Eine weitere nützliche Funktion ist die Möglichkeit, Zeilen basierend auf einem Muster zu finden. Beispielsweise können wir "line" nur in Zeilen, die "third" oder "fourth" enthalten, durch "row" ersetzen:
sed '/\(third\|fourth\)/ s/line/row/' ~/project/numbered.txt
Die Ausgabe sollte sein:
Line 1: This is the first line.
Line 2: This is the second line.
Line 3: This is the third row.
Line 4: This is the fourth row.
Line 5: This is the fifth line.
Die Kombination mehrerer Befehle
Wir können mehrere sed-Befehle mit der Option -e kombinieren oder die Befehle durch Semikolons trennen.
Ersetzen wir "first" durch "1st", "second" durch "2nd" und "third" durch "3rd" in einem einzigen Befehl:
sed -e 's/first/1st/' -e 's/second/2nd/' -e 's/third/3rd/' ~/project/numbered.txt
Alternativ können wir Semikolons verwenden:
sed 's/first/1st/; s/second/2nd/; s/third/3rd/' ~/project/numbered.txt
Beide Befehle sollten die gleiche Ausgabe erzeugen:
Line 1: This is the 1st line.
Line 2: This is the 2nd line.
Line 3: This is the 3rd line.
Line 4: This is the fourth line.
Line 5: This is the fifth line.
Machen wir nun diese Änderungen dauerhaft:
sed -i 's/first/1st/; s/second/2nd/; s/third/3rd/' ~/project/numbered.txt
Und überprüfen wir die Änderungen:
cat ~/project/numbered.txt
Sie sollten den aktualisierten Text mit Ordinalzahlen sehen.