Einführung
Willkommen im Linux Stream Editing Lab. In diesem Lab werden Sie lernen, wie Sie sed (Stream Editor), ein leistungsstarkes Kommandozeilen-Tool zum Parsen und Transformieren von Text, verwenden. sed wird verwendet, um grundlegende Texttransformationen an einem Eingabestrom (eine Datei oder Eingabe aus einer Pipeline) durchzuführen.
Am Ende dieses Labs können Sie:
- Grundlegende Textersetzungen mit
seddurchführen - Dateien direkt bearbeiten, indem Sie
sedverwenden - Globale Ersetzungen in gesamten Dateien anwenden
- Fortgeschrittene Textverarbeitungstechniken nutzen
Die von Ihnen erlernten Fähigkeiten werden Ihnen helfen, Dateien und Textströme effizient zu manipulieren, was für verschiedene Systemadministrations- und Textverarbeitungstasks in Linux unerlässlich ist.
Grundlegende Verwendung von sed und Textersetzung
In diesem Schritt lernen wir die Grundlagen von sed und wie man einfache Textersetzungen durchführt. Der sed-Befehl ist ein leistungsstarkes Textverarbeitungstool, das es Ihnen ermöglicht, Text in Dateien zu suchen, zu finden und zu ersetzen, einzufügen und zu löschen, ohne diese in einem Editor zu öffnen.
Zunächst überprüfen wir, ob sed auf unserem System installiert ist, indem wir folgenden Befehl ausführen:
which sed
Sie sollten eine Ausgabe ähnlich der folgenden sehen:
/usr/bin/sed
Dies bestätigt, dass sed verfügbar ist. Wenn es aus irgendeinem Grund nicht installiert ist, können Sie es mit folgenden Befehlen installieren:
sudo apt-get update
sudo apt-get install -y sed
Jetzt erstellen wir eine Textdatei, mit der wir arbeiten können. Wir erstellen eine Datei namens sample.txt im aktuellen Verzeichnis:
echo "Linux is a powerful operating system." > ~/project/sample.txt
echo "Many users prefer Linux for servers." >> ~/project/sample.txt
echo "Linux has strong security features." >> ~/project/sample.txt
Lassen Sie uns den Inhalt unserer neuen Datei untersuchen:
cat ~/project/sample.txt
Sie sollten Folgendes sehen:
Linux is a powerful operating system.
Many users prefer Linux for servers.
Linux has strong security features.
Jetzt verwenden wir sed, um eine grundlegende Ersetzung durchzuführen. Der folgende Befehl ersetzt das erste Vorkommen von "Linux" durch "Ubuntu" in jeder Zeile:
sed 's/Linux/Ubuntu/' ~/project/sample.txt
Sie sollten Folgendes sehen:
Ubuntu is a powerful operating system.
Many users prefer Ubuntu for servers.
Ubuntu has strong security features.
Beachten Sie, dass sed den geänderten Text an die Standardausgabe (Ihr Terminal) ausgab, aber die ursprüngliche Datei unverändert bleibt. Sie können dies überprüfen, indem Sie folgenden Befehl ausführen:
cat ~/project/sample.txt
Die Ausgabe sollte immer noch "Linux" und nicht "Ubuntu" anzeigen:
Linux is a powerful operating system.
Many users prefer Linux for servers.
Linux has strong security features.
Die grundlegende Syntax für die sed-Ersetzung lautet:
sed 's/pattern/replacement/' filename
Dabei bedeuten:
sist der Ersetzbefehlpatternist der Text, den Sie ersetzen möchtenreplacementist der neue Textfilenameist die Eingabedatei
Versuchen wir ein weiteres Beispiel. Diesmal ersetzen wir "powerful" durch "versatile":
sed 's/powerful/versatile/' ~/project/sample.txt
Dies sollte folgende Ausgabe liefern:
Linux is a versatile operating system.
Many users prefer Linux for servers.
Linux has strong security features.
Direkte Bearbeitung und globale Ersetzung
Im vorherigen Schritt haben wir gelernt, wie man sed für grundlegende Textersetzungen verwendet. Die Änderungen wurden jedoch nur auf dem Bildschirm angezeigt und nicht in der Datei gespeichert. In diesem Schritt lernen wir, wie man:
- Dateien direkt mit der Option
-ibearbeitet - Globale Ersetzungen mit der Kennzeichnung
gdurchführt
Direkte Dateibearbeitung
Um dauerhafte Änderungen an einer Datei mit sed vorzunehmen, verwenden wir die Option -i. Diese Option ändert die Datei direkt, anstatt nur die Ausgabe im Terminal anzuzeigen.
Ändern wir unsere sample.txt-Datei, indem wir "Linux" durch "Ubuntu" ersetzen:
sed -i 's/Linux/Ubuntu/' ~/project/sample.txt
Im Gegensatz zum vorherigen Schritt erzeugt dieser Befehl keine sichtbare Ausgabe. Überprüfen wir den Inhalt der Datei, um zu sehen, ob sich etwas geändert hat:
cat ~/project/sample.txt
Sie sollten jetzt Folgendes sehen:
Ubuntu is a powerful operating system.
Many users prefer Ubuntu for servers.
Ubuntu has strong security features.
Die Änderungen wurden in der Datei gespeichert! Dies ist die Stärke der direkten Dateibearbeitung mit sed.
Globale Ersetzung
Standardmäßig ersetzt sed nur das erste Vorkommen des Musters in jeder Zeile. Um alle Vorkommen zu ersetzen, verwenden wir die Kennzeichnung g (global) am Ende des Ersetzbefehls.
Erstellen wir eine neue Datei mit wiederholtem Text:
echo "The red car stopped at the red light near the red building." > ~/project/colors.txt
Jetzt verwenden wir sed ohne die globale Kennzeichnung, um "red" durch "blue" zu ersetzen:
sed 's/red/blue/' ~/project/colors.txt
Sie sollten Folgendes sehen:
The blue car stopped at the red light near the red building.
Beachten Sie, dass nur das erste Vorkommen von "red" durch "blue" ersetzt wurde. Jetzt verwenden wir die globale Kennzeichnung:
sed 's/red/blue/g' ~/project/colors.txt
Die Ausgabe sollte sein:
The blue car stopped at the blue light near the blue building.
Alle Vorkommen von "red" wurden durch "blue" ersetzt!
Wenden wir dies auf unsere sample.txt-Datei an. Zunächst fügen wir mehr Vorkommen von "Ubuntu" hinzu:
echo "Ubuntu is great. I use Ubuntu daily for my work with Ubuntu tools." >> ~/project/sample.txt
Jetzt ersetzen wir alle Vorkommen von "Ubuntu" durch "Linux" mit der globalen Kennzeichnung und direkter Dateibearbeitung:
sed -i 's/Ubuntu/Linux/g' ~/project/sample.txt
Überprüfen wir die Änderungen:
cat ~/project/sample.txt
Sie sollten Folgendes sehen:
Linux is a powerful operating system.
Many users prefer Linux for servers.
Linux has strong security features.
Linux is great. I use Linux daily for my work with Linux tools.
Alle Vorkommen von "Ubuntu" wurden im gesamten Dokument durch "Linux" ersetzt.
Erstellen einer Sicherungskopie vor der direkten Dateibearbeitung
Bei der direkten Dateibearbeitung ist es oft eine gute Praxis, eine Sicherungskopie der ursprünglichen Datei zu erstellen. Dies können Sie tun, indem Sie der Option -i eine Dateierweiterung hinzufügen:
sed -i.bak 's/Linux/Ubuntu/g' ~/project/sample.txt
Dieser Befehl wird:
- Eine Sicherungskopie von
sample.txtalssample.txt.bakerstellen - Alle Vorkommen von "Linux" durch "Ubuntu" in
sample.txtersetzen
Überprüfen wir beide Dateien:
cat ~/project/sample.txt
cat ~/project/sample.txt.bak
Der erste Befehl sollte alle "Linux" durch "Ubuntu" ersetzt anzeigen, während die Sicherungskopie immer noch "Linux" enthalten sollte.
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.
Arbeiten mit sed-Skripten
In den vorherigen Schritten haben wir sed-Befehle direkt von der Kommandozeile aus ausgeführt. Für komplexere Operationen ist es jedoch oft bequemer, eine sed-Skriptdatei zu erstellen. Dies ermöglicht uns:
- Mehrere
sed-Befehle zu organisieren - Kommentare hinzuzufügen, um zu erklären, was jeder Befehl tut
- Die gleichen Operationen auf verschiedenen Dateien wiederzuverwenden
Erstellen eines sed-Skripts
Erstellen wir ein einfaches sed-Skript, das mehrere Texttransformationen durchführt:
cat > ~/project/transform.sed << 'EOF'
## Replace "Linux" with "Ubuntu"
s/Linux/Ubuntu/g
## Replace "user" with "developer"
s/user/developer/g
## Replace "system" with "platform"
s/system/platform/g
## Convert "is" to uppercase
s/is/IS/g
EOF
Dieses Skript führt vier Ersetzungen durch:
- Ersetzt alle Vorkommen von "Linux" durch "Ubuntu"
- Ersetzt alle Vorkommen von "user" durch "developer"
- Ersetzt alle Vorkommen von "system" durch "platform"
- Konvertiert alle Vorkommen von "is" in Großbuchstaben "IS"
Erstellen wir eine neue Datei, um unser Skript zu testen:
cat > ~/project/test.txt << 'EOF'
Linux is a powerful operating system.
The user interface is very customizable.
Many Linux users prefer the command-line interface.
The system resources are efficiently managed.
EOF
Ausführen eines sed-Skripts
Um unser sed-Skript auf der Testdatei auszuführen, verwenden wir die Option -f:
sed -f ~/project/transform.sed ~/project/test.txt
Sie sollten Folgendes sehen:
Ubuntu IS a powerful operating platform.
The developer interface IS very customizable.
Many Ubuntu developers prefer the command-line interface.
The platform resources are efficiently managed.
Alle Ersetzungen aus unserem Skript wurden angewendet!
Direkte Dateibearbeitung mit einem Skript
Genau wie bei sed-Befehlen von der Kommandozeile können wir die Option -i verwenden, um eine direkte Dateibearbeitung mit einem Skript durchzuführen:
sed -i -f ~/project/transform.sed ~/project/test.txt
Überprüfen wir die Änderungen:
cat ~/project/test.txt
Die Datei sollte jetzt den transformierten Text enthalten.
Erstellen einer Sicherungskopie mit einem Skript
Wir können erneut eine Sicherungskopie erstellen, bevor wir Änderungen vornehmen:
## First, let's restore the original content
cat > ~/project/test.txt << 'EOF'
Linux is a powerful operating system.
The user interface is very customizable.
Many Linux users prefer the command-line interface.
The system resources are efficiently managed.
EOF
## Now run sed with a backup
sed -i.bak -f ~/project/transform.sed ~/project/test.txt
Überprüfen wir sowohl die geänderte Datei als auch die Sicherungskopie:
cat ~/project/test.txt
cat ~/project/test.txt.bak
Der erste Befehl sollte den transformierten Text anzeigen, während die Sicherungskopie den ursprünglichen Text enthalten sollte.
Anwenden eines sed-Skripts auf mehrere Dateien
Einer der Vorteile der Verwendung eines sed-Skripts ist, dass wir die gleichen Transformationen leicht auf mehrere Dateien anwenden können.
Erstellen wir ein paar weitere Testdateien:
## Create test1.txt
cat > ~/project/test1.txt << 'EOF'
Linux offers excellent system performance.
Many users appreciate its stability.
EOF
## Create test2.txt
cat > ~/project/test2.txt << 'EOF'
The Linux community provides great support.
New users can find helpful resources online.
EOF
## Create test3.txt
cat > ~/project/test3.txt << 'EOF'
The system updates are well-managed in Linux.
Users can customize their experience.
EOF
Jetzt wenden wir unser sed-Skript auf alle diese Dateien auf einmal an:
sed -i -f ~/project/transform.sed ~/project/test1.txt ~/project/test2.txt ~/project/test3.txt
Überprüfen wir die Änderungen:
cat ~/project/test1.txt
cat ~/project/test2.txt
cat ~/project/test3.txt
Alle drei Dateien sollten den transformierten Text gemäß unserem Skript anzeigen.
Dies zeigt die Stärke von sed-Skripten für die Batch-Verarbeitung mehrerer Dateien mit der gleichen Gruppe von Transformationen.
Zusammenfassung
In diesem Lab haben Sie gelernt, wie Sie sed, den Stream Editor (Strom-Editor), verwenden können, um Textdateien in Linux zu bearbeiten. Sie haben praktische Erfahrungen in mehreren wichtigen Aspekten von sed gesammelt:
- Grundlegende Textersetzung mit dem
s-Befehl - Direkte Dateibearbeitung mit der Option
-i - Globale Ersetzung mit der
g-Flagge - Erstellen von Sicherungskopien vor der Bearbeitung mit der Option
-i.bak - Verwendung verschiedener Trennzeichen für Ersetzungsmuster
- Die gezielte Bearbeitung bestimmter Zeilen mit Adressen und Zeilenbereichen
- Erstellen und Ausführen von
sed-Skripten für komplexere Operationen - Anwenden von Transformationen auf mehrere Dateien auf einmal
Diese Fähigkeiten sind für die effiziente Textverarbeitung in Linux-Umgebungen unerlässlich. Die Fähigkeit, Textdateien zu bearbeiten, ohne sie in einem Editor zu öffnen, ist besonders wertvoll für Systemadministratoren, Entwickler und Datenanalysten, die oft große Mengen an Textdaten verarbeiten oder systematische Änderungen an mehreren Dateien vornehmen müssen.
Wenn Sie weiterhin mit Linux arbeiten, werden Sie feststellen, dass sed ein unverzichtbares Werkzeug in Ihrem Textverarbeitungsset ist, zusammen mit anderen Hilfsprogrammen wie grep, awk und cut.



