Der Sed-Befehl oder Stream Editor ist ein sehr mächtiges Dienstprogramm, das von Linux/Unix-Systemen angeboten wird. Es wird hauptsächlich zum Ersetzen von Text, Finden & Ersetzen verwendet, kann aber auch andere Textmanipulationen wie Einfügen, Löschen, Suchen usw. durchführen. Mit SED können wir komplette Dateien bearbeiten, ohne sie tatsächlich öffnen zu müssen. Sed unterstützt auch die Verwendung von regulären Ausdrücken, was sed zu einem noch mächtigeren Werkzeug zur Textmanipulation macht.
In diesem Artikel werden wir anhand einiger Beispiele lernen, den Befehl SED zu verwenden. Die grundlegende Syntax für die Verwendung des sed-Befehls lautet,
sed OPTIONS…
Nun sehen wir uns einige Beispiele an.
Beispiel :1) Einen Teil des Textes einer Datei anzeigen
Mit sed können wir nur einen Teil einer Datei anzeigen, anstatt die ganze Datei zu sehen. Um einige Zeilen der Datei zu sehen, verwenden Sie den folgenden Befehl,
$ sed -n 22,29p testfile.txt
hier unterdrückt die Option ’n‘ die Ausgabe der gesamten Datei,& die Option ‚p‘ gibt nur die Zeilen von 22 bis 29 aus.
Beispiel :2) Alles bis auf einige Zeilen anzeigen
Um den gesamten Inhalt einer Datei bis auf einen Teil anzuzeigen, verwenden Sie den folgenden Befehl,
$ sed 22,29d testfile.txt
Option ‚d‘ entfernt die genannten Zeilen aus der Ausgabe.
Beispiel :3) Jede 3. Zeile ab der N-ten Zeile anzeigen
Um den Inhalt jeder 3. Zeile ab der Zeilennummer 2 oder einer beliebigen anderen Zeile anzuzeigen, verwenden Sie den folgenden Befehl
$ sed -n '2~3p' file.txt
Beispiel :4 ) Löschen einer Zeile mit dem sed-Befehl
Um eine Zeile mit sed aus einer Datei zu löschen, verwenden Sie den folgenden Befehl,
$ sed Nd testfile.txt
wobei ‚N‘ die Zeilennummer ist& die Option ‚d‘ löscht die genannte Zeilennummer. Um die letzte Zeile der Datei zu löschen, verwenden Sie
$ sed $d testfile.txt
Beispiel :5) Löschen eines Bereichs von Zeilen
Um einen Bereich von Zeilen aus der Datei zu löschen, führen Sie
$ sed '29,34d' testfile.txt
Dies löscht die Zeilen 29 bis 34 aus der Datei testfile.txt.
Beispiel :6) Löschen von anderen als den erwähnten Zeilen
Um andere als die erwähnten Zeilen aus einer Datei zu löschen, verwenden wir ‚!‘
$ sed '29,34!d' testfile.txt
Hier wird die Option ‚!‘ verwendet, so dass die Bedingung umgekehrt wird, d.h. die erwähnten Zeilen werden nicht gelöscht. Alle Zeilen außer 29-34 werden aus der Datei testfile.txt gelöscht.
Beispiel :7) Hinzufügen von Leerzeilen/Leerzeichen
Um nach jeder nicht-leeren Zeile eine Leerzeile einzufügen, verwenden wir die Option ‚G‘,
$ sed G testfile.txt
Beispiel :8) Suchen und Ersetzen einer Zeichenkette mit sed
Um &eine Zeichenkette aus der Datei zu suchen und zu ersetzen, verwenden wir das folgende Beispiel,
$ sed 's/danger/safety/' testfile.txt
hier sucht die Option ’s‘ das Wort ‚Gefahr‘ & und ersetzt es in jeder Zeile nur beim ersten Vorkommen durch ‚Sicherheit‘.
Beispiel :9) Suchen und Ersetzen einer Zeichenkette aus der gesamten Datei mit sed
Um das Wort komplett aus der Datei zu ersetzen, verwenden wir die Option ‚g‘ mit ’s‘,
$ sed 's/danger/safety/g' testfile.txt
Beispiel :10) Ersetzen des n-ten Vorkommens eines Stringmusters
Wir können auch einen String beim n-ten Vorkommen aus einer Datei ersetzen. Ersetzen Sie z.B. ‚Gefahr‘ durch ‚Sicherheit‘ nur beim zweiten Vorkommen,
$ sed ‘s/danger/safety/2’ testfile.txt
Um ‚Gefahr‘ beim 2. Vorkommen jeder Zeile aus der ganzen Datei zu ersetzen, verwenden Sie
$ sed 's/danger/safety/2g' testfile.txt
Beispiel :11) Ersetzen einer Zeichenkette in einer bestimmten Zeile
Um eine Zeichenkette nur in einer bestimmten Zeile zu ersetzen, verwenden Sie
$ sed '4 s/danger/safety/' testfile.txt
Damit wird nur die Zeichenkette ab der 4. Zeile der Datei ersetzt. Wir können auch einen Bereich von Zeilen anstelle einer einzelnen Zeile angeben,
$ sed '4,9 s/danger/safety/' testfile.txt
Beispiel :12) Eine Zeile nach/vor dem Suchmuster hinzufügen
Um nach jedem Suchmuster eine neue Zeile mit einem bestimmten Inhalt hinzuzufügen, verwenden Sie die Option ‚a‘,
$ sed '/danger/a "This is new line with text after match"' testfile.txt
Um vor jedem Suchmuster eine neue Zeile mit einem bestimmten Inhalt hinzuzufügen, verwenden Sie die Option ‚i‘,
$ sed '/danger/i "This is new line with text before match" ' testfile.txt
Beispiel :13) Ändern einer ganzen Zeile bei übereinstimmendem Muster
Um eine ganze Zeile in eine neue Zeile zu ändern, wenn ein Suchmuster übereinstimmt, müssen wir die Option ‚c‘ mit sed verwenden,
$ sed '/danger/c "This will be the new line" ' testfile.txt
So wird bei Übereinstimmung mit dem Muster ‚danger‘ die ganze Zeile in die genannte Zeile geändert.
Erweiterte Möglichkeiten mit sed
Bis jetzt haben wir nur einfache Ausdrücke mit sed verwendet, jetzt werden wir einige fortgeschrittene Anwendungen von sed mit regex besprechen,
Beispiel :14) Mehrere sed-Befehle ausführen
Wenn wir mehrere sed-Ausdrücke ausführen müssen, können wir die Option ‚e‘ verwenden, um die sed-Befehle zu verketten,
$ sed -e 's/danger/safety/g' -e 's/hate/love/' testfile.txt
Beispiel :15) Erstellen einer Sicherungskopie vor dem Bearbeiten einer Datei
Um eine Sicherungskopie einer Datei zu erstellen, bevor wir sie bearbeiten, verwenden Sie die Option ‚-i.bak‘,
$ sed -i.bak -e 's/danger/safety/g' testfile.txt
Damit wird eine Sicherungskopie der Datei mit der Erweiterung .bak erstellt. Sie können auch eine andere Erweiterung verwenden, wenn Sie möchten.
Beispiel :16) Löschen einer Dateizeile, die mit & beginnt und mit einem Muster endet
Um eine Zeile zu löschen, die mit einer bestimmten Zeichenfolge & beginnt und mit einer anderen Zeichenfolge endet, verwenden
$ sed -e 's/^danger.*stops$//g' testfile.txt
Damit wird die Zeile mit ‚danger‘ am Anfang & ’stops‘ am Ende & gelöscht, es können beliebig viele Wörter dazwischen stehen, ‚.*‘ definiert diesen Teil.
Beispiel :17) Zeilen anhängen
Um vor jeder Zeile mit sed & regex etwas Inhalt hinzuzufügen, verwenden Sie
$ sed -e 's/.*/testing sed &/' testfile.txt
So wird nun jeder Zeile ‚testing sed‘ vorangestellt.
Beispiel :18) Entfernen aller kommentierten Zeilen & leere Zeilen
Um alle kommentierten Zeilen zu entfernen, d.h. Zeilen mit # & alle leeren Zeilen, verwenden Sie
$ sed -e 's/#.*//;/^$/d' testfile.txt
Um nur kommentierte Zeilen zu entfernen, verwenden Sie
$ sed -e 's/#.*//' testfile.txt
Beispiel :19) Liste aller Benutzernamen aus /etc/passwd holen
Um die Liste aller Benutzernamen aus der Datei /etc/passwd zu holen, verwenden Sie
$ sed 's/\(*\).*/\1/' /etc/passwd
Eine komplette Liste aller Benutzernamen wird als Ausgabe auf dem Bildschirm erzeugt.
Beispiel :20) Überschreiben von Systemlinks mit dem sed-Befehl verhindern
Der Befehl ’sed -i‘ ist dafür bekannt, dass er Systemlinks entfernt & und nur reguläre Dateien anstelle der Link-Datei erzeugt. Um eine solche Situation zu vermeiden, & verhindern Sie, dass ’sed -i‘ die Links zerstört, indem Sie die Option ‚-follow-symklinks‘ mit dem auszuführenden Befehl verwenden.
Angenommen, ich möchte SELinux auf CentOS oder RHEL Severs deaktivieren
# sed -i --follow-symlinks 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux