Linux Stream-Editor

LinuxBeginner
Jetzt üben

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 sed durchführen
  • Dateien direkt bearbeiten, indem Sie sed verwenden
  • 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:

  • s ist der Ersetzbefehl
  • pattern ist der Text, den Sie ersetzen möchten
  • replacement ist der neue Text
  • filename ist 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:

  1. Dateien direkt mit der Option -i bearbeitet
  2. Globale Ersetzungen mit der Kennzeichnung g durchfü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:

  1. Eine Sicherungskopie von sample.txt als sample.txt.bak erstellen
  2. Alle Vorkommen von "Linux" durch "Ubuntu" in sample.txt ersetzen

Ü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:

  1. Die Verwendung verschiedener Trennzeichen
  2. Die Angabe von Zeilenbereichen für die gezielte Bearbeitung bestimmter Zeilen
  3. 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:

  1. Mehrere sed-Befehle zu organisieren
  2. Kommentare hinzuzufügen, um zu erklären, was jeder Befehl tut
  3. 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:

  1. Ersetzt alle Vorkommen von "Linux" durch "Ubuntu"
  2. Ersetzt alle Vorkommen von "user" durch "developer"
  3. Ersetzt alle Vorkommen von "system" durch "platform"
  4. 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.