Advanced sed: Verwalten von Textstreams unter Linux. Mit dem Linux-Stream-Texteditor sed Sed eine Zeile in eine Datei einfügen

Das letzte Mal haben wir über Funktionen in Bash-Skripten gesprochen, insbesondere wie man sie über die Kommandozeile aufruft. Unser heutiges Thema ist ein sehr nützliches Werkzeug zum Verarbeiten von String-Daten - ein Linux-Dienstprogramm namens sed. Es wird häufig verwendet, um mit Texten in Form von Protokolldateien, Konfigurationsdateien und anderen Dateien zu arbeiten.



Wenn Sie Daten in Bash-Skripten in irgendeiner Weise manipulieren, sollten Sie mit den Werkzeugen sed und gawk vertraut sein. Hier konzentrieren wir uns auf Sed- und Textmanipulation, da dies ein sehr wichtiger Schritt auf unserer Reise durch die Weiten der Bash-Skriptentwicklung ist.

Jetzt werden wir die Grundlagen der Arbeit mit sed behandeln und uns mehr als drei Dutzend Beispiele für die Verwendung dieses Tools ansehen.

Sed-Grundlagen

Sed wird als Stream-Text-Editor bezeichnet. In interaktiven Texteditoren wie nano werden Texte über die Tastatur bearbeitet, Dateien bearbeitet, Texte hinzugefügt, gelöscht oder geändert. Mit Sed können Sie Datenströme basierend auf entwicklerdefinierten Regelsätzen bearbeiten. So sieht der Aufruf dieses Befehls aus:

$ sed-Optionsdatei
Standardmäßig wendet sed die beim Aufruf von STDIN angegebenen Befehlssatzregeln an. Dadurch können Daten direkt an sed übergeben werden.

Zum Beispiel so:

$ echo "Dies ist ein Test" | sed "s / test / ein anderer test /"
Folgendes erhalten Sie, wenn Sie diesen Befehl ausführen.


Ein einfaches Sed-Call-Beispiel

In diesem Fall ersetzt sed das Wort "test" in der zur Bearbeitung übergebenen Zeile durch das Wort "another test". Zur Formatierung der Regel für die Verarbeitung von Text in Anführungszeichen werden Schrägstriche verwendet. In unserem Fall haben wir einen Befehl wie s / Muster1 / Muster2 / verwendet. Der Buchstabe "s" ist eine Abkürzung des Wortes "Ersatz", dh wir stehen vor einem Ersatzbefehl. Sed, das diesen Befehl ausführt, scannt den übertragenen Text und ersetzt die darin gefundenen Fragmente (über welche, wir weiter unten sprechen), die Muster1 entsprechen, durch Muster2.

Oben ist ein primitives Sed-Beispiel, um Sie auf den neuesten Stand zu bringen. Tatsächlich kann sed in viel komplexeren Textverarbeitungsszenarien verwendet werden, beispielsweise beim Arbeiten mit Dateien.

Unten sehen Sie eine Datei, die einen Text enthält, und die Ergebnisse der Verarbeitung mit diesem Befehl:

$ sed "s / test / anderer Test" ./myfile


Textdatei und Ergebnisse ihrer Verarbeitung

Dies ist der gleiche Ansatz, den wir oben verwendet haben, aber sed verarbeitet jetzt den in der Datei gespeicherten Text. Wenn die Datei jedoch groß genug ist, werden Sie feststellen, dass sed die Daten in Blöcken verarbeitet und das Verarbeitete auf dem Bildschirm ausgibt, ohne auf die Verarbeitung der gesamten Datei zu warten.

Sed ändert die Daten in der verarbeiteten Datei nicht. Der Editor liest die Datei, verarbeitet die gelesenen Daten und sendet die Ausgabe an STDOUT. Um sicherzustellen, dass sich die Originaldatei nicht verändert hat, genügt es, sie nach der Übergabe an sed zu öffnen. Bei Bedarf kann die Ausgabe von sed in eine Datei umgeleitet werden, wobei möglicherweise die alte Datei überschrieben wird. Wenn Sie mit einer der vorherigen Serien in dieser Serie über das Umleiten von Eingabe- und Ausgabeströmen vertraut sind, sollten Sie in der Lage sein, dies zu tun.

Ausführen von Befehlssätzen beim Aufruf von sed

Um mehrere Aktionen für die Daten auszuführen, verwenden Sie beim Aufrufen von sed den Schalter -e. So arrangieren Sie beispielsweise das Ersetzen von zwei Textteilen:

$ sed -e "s / This / That /; s / test / other test /" ./myfile


Verwenden des Schalters -e beim Aufrufen von sed

Beide Befehle werden auf jede Textzeile in der Datei angewendet. Trennen Sie sie durch ein Semikolon, ohne Leerzeichen zwischen dem Ende des Befehls und dem Semikolon.
Um beim Aufruf von sed mehrere Muster der Textverarbeitung einzugeben, können Sie nach Eingabe des ersten einfachen Anführungszeichens die Eingabetaste drücken und dann jede Regel in einer neuen Zeile eingeben, wobei das abschließende Anführungszeichen nicht vergessen wird:

$ sed -e "> s / This / That /> s / test / other test /" ./myfile
Dies geschieht, nachdem der in diesem Formular dargestellte Befehl ausgeführt wurde.


Eine andere Möglichkeit, mit sed zu arbeiten

Befehle aus einer Datei lesen

Wenn Sie viele sed-Befehle zum Verarbeiten von Text haben, ist es normalerweise am besten, diese zuerst in eine Datei zu schreiben. Um die Datei anzugeben, die die Befehle für sed enthält, verwenden Sie den Schalter -f:

Hier ist der Inhalt der mycommands-Datei:

S / Dies / Das / s / Test / Anderer Test /
Rufen wir sed auf und übergeben die Befehlsdatei und die zu verarbeitende Datei an den Editor:

$ sed -f mycommands myfile
Das Ergebnis beim Aufrufen eines solchen Befehls ähnelt dem in den vorherigen Beispielen erhaltenen.


Verwenden einer Datei mit Befehlen beim Aufrufen von sed

Ersatzbefehlsflags

Schauen Sie sich das folgende Beispiel genau an.

$ sed "s / test / other test /" myfile
Dies ist, was in der Datei steht und was sed nach der Verarbeitung erhält.


Die Originaldatei und die Ergebnisse ihrer Verarbeitung

Der Ersetzungsbefehl verarbeitet normalerweise eine Datei, die aus mehreren Zeilen besteht, aber nur das erste Vorkommen des Suchtextes in jeder Zeile wird ersetzt. Um alle Vorkommen eines Musters zu ersetzen, müssen Sie das entsprechende Flag verwenden.

Das Schema zum Schreiben des Ersetzungsbefehls bei Verwendung von Flags sieht wie folgt aus:

S / Muster / Ersatz / Flaggen
Die Ausführung dieses Befehls kann auf verschiedene Weise geändert werden.

  • Beim Übertragen der Nummer wird die Sequenznummer des Vorkommens des Musters im String berücksichtigt, dieses Vorkommen wird ersetzt.
  • Das g-Flag gibt an, alle Vorkommen des Musters in der Zeichenfolge zu verarbeiten.
  • Das p-Flag gibt an, den Inhalt der ursprünglichen Zeichenfolge zu drucken.
  • Ein Flag der Form w file weist den Befehl an, die Ergebnisse der Textverarbeitung in eine Datei zu schreiben.
Betrachten Sie die Verwendung der ersten Variante des Ersetzungsbefehls, die die Position des ersetzten Vorkommens des gewünschten Fragments angibt:

$ sed "s / test / anderer Test / 2" myfile

Aufruf des Ersetzungsbefehls mit Angabe der Position des zu ersetzenden Fragments

Hier haben wir als Ersetzungsflag die Zahl 2 angegeben. Dies führte dazu, dass nur das zweite Vorkommen des gewünschten Musters in jeder Zeile ersetzt wurde. Probieren wir nun das globale Ersetzen-Flag - g aus:

$ sed "s / test / other test / g" myfile
Wie Sie an der Ausgabe sehen können, ersetzt dieser Befehl alle Vorkommen des Musters im Text.


Globaler Ersatz

Mit dem Ersetzungsbefehlsflag p können Sie übereinstimmende Zeilen drucken, aber die beim Aufrufen von sed angegebene Option -n unterdrückt die normale Ausgabe:

$ sed -n "s / test / other test / p" myfile
Dadurch werden beim Ausführen von sed in dieser Konfiguration nur die Zeilen (in unserem Fall eine Zeile) angezeigt, in denen das angegebene Textfragment gefunden wurde.


Verwenden des Befehlsflags p replace

Verwenden wir das w-Flag, mit dem wir die Ergebnisse der Textverarbeitung in einer Datei speichern können:

$ sed "s / test / other test / w output" myfile


Speichern von Textverarbeitungsergebnissen in einer Datei

Es ist deutlich zu erkennen, dass während der Ausführung des Befehls die Daten ausgegeben werden, während die verarbeiteten Zeilen in die Datei geschrieben werden, deren Name nach w angegeben ist.

Trennzeichen

Stellen Sie sich vor, Sie ersetzen / bin / bash durch / bin / csh in / etc / passwd. Die Aufgabe ist nicht so schwer:

$ sed "s / \ / bin \ / bash / \ / bin \ / csh /" / etc / passwd
Das alles sieht jedoch nicht sehr gut aus. Tatsache ist, dass, da Schrägstriche als Trennzeichen verwendet werden, dieselben Zeichen in den an sed übergebenen Zeilen maskiert werden müssen. Dadurch leidet die Lesbarkeit des Befehls.

Glücklicherweise erlaubt uns sed, die Trennzeichen für die Verwendung im Ersetzungsbefehl selbst zu definieren. Das Trennzeichen ist das erste Zeichen, das nach s angetroffen wird:

$ sed "s! / bin / bash! / bin / csh!" /etc/passwd
In diesem Fall wird ein Ausrufezeichen als Trennzeichen verwendet, dadurch ist der Code besser lesbar und sieht viel sauberer aus als zuvor.

Auswählen von Textfragmenten zur Verarbeitung

Bisher haben wir sed aufgerufen, um den gesamten an den Editor übergebenen Datenstrom zu verarbeiten. In einigen Fällen muss sed nur einen Teil des Textes verarbeiten – eine bestimmte Zeile oder Gruppe von Zeilen. Um dieses Ziel zu erreichen, können Sie zwei Ansätze verfolgen:
  • Legen Sie ein Limit für die Anzahl der verarbeiteten Zeilen fest.
  • Geben Sie den Filter an, für den Zeilen verarbeitet werden sollen.
Betrachten wir den ersten Ansatz. Hier sind zwei Möglichkeiten zulässig. Die erste, die im Folgenden betrachtet wird, sieht die Angabe der Nummer einer zu verarbeitenden Zeile vor:

$ sed "2s / test / other test /" myfile


Verarbeite nur eine Zeile, die beim Aufruf von sed angegebene Nummer

Die zweite Option ist eine Reihe von Zeichenfolgen:

$ sed "2,3s / test / anderer Test /" myfile


Umgang mit einer Reihe von Zeichenfolgen

Außerdem können Sie den Ersetzungsbefehl aufrufen, damit die Datei ab einer bestimmten Zeile bis zum Ende abgearbeitet wird:

$ sed "2, $ s / test / weiterer Test /" myfile


Verarbeitung einer Datei von der zweiten Zeile bis zum Ende

Um mit dem replace-Befehl nur Zeilen zu verarbeiten, die dem angegebenen Filter entsprechen, muss der Befehl wie folgt aufgerufen werden:

$ sed "/ likegeeks / s / bash / csh /" / etc / passwd
Ähnlich wie oben beschrieben wird das Muster vor dem Befehlsnamen s übergeben.


Verarbeiten von Zeilen, die einem Filter entsprechen

Wir haben hier einen sehr einfachen Filter verwendet. Um die Möglichkeiten dieses Ansatzes voll auszuschöpfen, können Sie reguläre Ausdrücke verwenden. Wir werden in einem der nächsten Materialien dieser Serie darüber sprechen.

Zeilen löschen

Sed eignet sich für mehr, als nur eine Zeichenfolge in Strings durch eine andere zu ersetzen. Mit seiner Hilfe, nämlich mit dem Befehl d, können Sie Zeilen aus dem Textstrom entfernen.

Der Befehlsaufruf sieht so aus:

$ sed "3d" myfile
Wir möchten, dass die dritte Zeile aus dem Text entfernt wird. Beachten Sie, dass dies keine Datei ist. Die Datei bleibt unverändert, das Löschen wirkt sich nur auf die Ausgabe aus, die sed erzeugt.


Entfernen der dritten Zeile

Wenn Sie beim Aufruf des d-Befehls die zu löschende Zeilennummer nicht angeben, werden alle Zeilen im Stream gelöscht.

So wenden Sie den Befehl d auf eine Reihe von Zeichenfolgen an:

$ sed "2,3d" myfile


Löschen eines Zeilenbereichs

Und so löschen Sie Zeilen, die mit der angegebenen bis zum Ende der Datei beginnen:

$ sed "3, $ d" meine Datei


Zeilen bis zum Ende der Datei löschen

Linien können auch nach Muster gelöscht werden:

$ sed "/test / d" myfile


Linien nach Muster löschen

Beim Aufruf von d können Sie einige Muster angeben - die Zeilen, in denen das Muster gefunden wird, und die dazwischen liegenden Zeilen werden gelöscht:

$ sed "/ zweite /, / vierte / d" myfile


Löschen eines Zeilenbereichs mithilfe von Vorlagen

Einfügen von Text in einen Stream

Mit sed können Sie mit den Befehlen i und a Daten in einen Textstream einfügen:
  • Der Befehl i fügt eine neue Zeile vor der angegebenen hinzu.
  • Der Befehl a fügt eine neue Zeile nach der angegebenen hinzu.
Sehen wir uns ein Beispiel für die Verwendung des i-Befehls an:

$ echo "Noch ein Test" | sed "i \ Erster Test"


Team i

Schauen wir uns nun den Befehl a an:

$ echo "Noch ein Test" | sed "a \ Erster Test"


Befehl a

Wie Sie sehen, fügen diese Befehle Text vor oder nach den Daten aus dem Stream hinzu. Was ist, wenn Sie irgendwo in der Mitte eine Zeile hinzufügen müssen?

Hier hilft uns die Angabe der Nummer der Referenzlinie im Stream oder der Vorlage. Beachten Sie, dass die Adressierung von Strings als Bereich hier nicht funktioniert. Rufen wir den Befehl i auf und geben die Zeilennummer an, vor der wir eine neue Zeile einfügen müssen:

$ sed "2i \ Dies ist die eingefügte Zeile." meine Datei


Ich befehle mit Referenzzeilennummer

Machen wir dasselbe mit dem a-Befehl:

$ sed "2a \ Dies ist die angehängte Zeile." meine Datei


Ein Befehl, der die Referenzzeilennummer angibt

Beachten Sie den Unterschied zwischen den Befehlen i und a. Die erste fügt eine neue Zeile vor der angegebenen ein, die zweite danach.

Ersetzen von Saiten

Mit dem Befehl c können Sie den Inhalt einer ganzen Textzeile in einem Datenstrom ändern. Beim Aufrufen müssen Sie die Leitungsnummer angeben, statt dessen müssen Sie dem Stream neue Daten hinzufügen:

$ sed "3c \ Dies ist eine modifizierte Zeile." meine Datei


Ersetzen einer ganzen Zeichenfolge

Wenn Sie beim Aufrufen eines Befehls ein Nur-Text- oder reguläres Ausdrucksmuster verwenden, werden alle Zeilen, die dem Muster entsprechen, ersetzt:

$ sed "/ Dies ist / c Dies ist eine geänderte Textzeile." meine Datei


Ersetzen von Strings durch Muster

Ersetzen von Zeichen

Der Befehl y bearbeitet einzelne Zeichen und ersetzt sie entsprechend den beim Aufruf übergebenen Daten:

$ sed "y / 123/567 /" myfile


Ersetzen von Zeichen

Wenn Sie diesen Befehl verwenden, müssen Sie berücksichtigen, dass er für den gesamten Textstrom gilt, Sie können ihn nicht auf bestimmte Vorkommen von Zeichen beschränken.

Zeilennummern anzeigen

Wenn Sie sed mit dem Befehl = aufrufen, gibt das Dienstprogramm die Zeilennummern im Datenstrom aus:

$ sed "=" meine Datei


Zeilennummern anzeigen

Der Streaming-Editor druckte Zeilennummern vor ihren Inhalt.

Wenn Sie diesem Befehl ein Muster übergeben und den Schalter sed -n verwenden, werden nur die Zeilennummern ausgegeben, die dem Muster entsprechen:

$ sed -n "/ test / =" meine Datei


Zeilennummern mit passendem Muster drucken

Lesen von Daten zum Einfügen aus einer Datei

Oben haben wir uns Techniken zum Einfügen von Daten in einen Stream angesehen, wobei wir direkt beim Aufruf von sed angeben, was eingefügt werden soll. Sie können auch eine Datei als Datenquelle verwenden. Verwenden Sie dazu den Befehl r, mit dem Sie Daten aus der angegebenen Datei in den Stream einfügen können. Beim Aufruf können Sie die Zeilennummer angeben, nach der Sie den Inhalt der Datei oder eine Vorlage einfügen müssen.

Betrachten wir ein Beispiel:

$ sed "3r newfile" myfile


Einfügen von Dateiinhalten in einen Stream

Hier wurde der Inhalt von newfile nach der dritten Zeile von myfile eingefügt.

Folgendes passiert, wenn Sie das Muster beim Aufrufen von r anwenden:

$ sed "/test / r newfile" myfile


Verwenden einer Vorlage beim Aufruf des r-Befehls

Der Inhalt der Datei wird nach jeder Zeile eingefügt, die dem Muster entspricht.

Beispiel

Stellen wir uns folgende Aufgabe vor. Es gibt eine Datei, in der eine bestimmte, an sich bedeutungslose Zeichenfolge vorhanden ist, die durch Daten aus einer anderen Datei ersetzt werden muss. Es sei nämlich die Datei newfile, in der die DATA-Zeichenfolge als Platzhalter fungiert. Die für DATA zu ersetzenden Daten werden in den Daten gespeichert.

Sie können dieses Problem mit den Befehlen r und d des Stream-Editors sed lösen:

$ Sed "/ DATA> / (r newfile d)" myfile


Ersetzen des Ortsindikators durch echte Daten

Wie Sie sehen, hat sed der Ausgabe anstelle des Platzhalters DATA zwei Zeilen aus der Datendatei hinzugefügt.

Ergebnisse

Heute haben wir die Grundlagen der Arbeit mit dem sed-Stream-Editor behandelt. Tatsächlich ist Sed ein riesiges Thema. Das Erlernen kann mit dem Erlernen einer neuen Programmiersprache verglichen werden, aber sobald Sie die Grundlagen verstanden haben, sollten Sie in der Lage sein, sed auf jedem Niveau zu beherrschen, das Sie benötigen. Dadurch sind Ihre Möglichkeiten, Texte damit zu bearbeiten, nur durch Ihre Vorstellungskraft begrenzt.

Das ist alles für heute. Lassen Sie uns das nächste Mal über die Datenverarbeitungssprache awk sprechen.

Liebe Leser! Verwenden Sie sed in Ihrer täglichen Arbeit? Wenn ja, teile bitte deine Erfahrungen.

Das letzte Mal haben wir über Funktionen in Bash-Skripten gesprochen, insbesondere wie man sie über die Kommandozeile aufruft. Unser heutiges Thema ist ein sehr nützliches Werkzeug zum Verarbeiten von String-Daten - ein Linux-Dienstprogramm namens sed. Es wird häufig verwendet, um mit Texten in Form von Protokolldateien, Konfigurationsdateien und anderen Dateien zu arbeiten.



Wenn Sie Daten in Bash-Skripten in irgendeiner Weise manipulieren, sollten Sie mit den Werkzeugen sed und gawk vertraut sein. Hier konzentrieren wir uns auf Sed- und Textmanipulation, da dies ein sehr wichtiger Schritt auf unserer Reise durch die Weiten der Bash-Skriptentwicklung ist.

Jetzt werden wir die Grundlagen der Arbeit mit sed behandeln und uns mehr als drei Dutzend Beispiele für die Verwendung dieses Tools ansehen.

Sed-Grundlagen

Sed wird als Stream-Text-Editor bezeichnet. In interaktiven Texteditoren wie nano werden Texte über die Tastatur bearbeitet, Dateien bearbeitet, Texte hinzugefügt, gelöscht oder geändert. Mit Sed können Sie Datenströme basierend auf entwicklerdefinierten Regelsätzen bearbeiten. So sieht der Aufruf dieses Befehls aus:

$ sed-Optionsdatei
Standardmäßig wendet sed die beim Aufruf von STDIN angegebenen Befehlssatzregeln an. Dadurch können Daten direkt an sed übergeben werden.

Zum Beispiel so:

$ echo "Dies ist ein Test" | sed "s / test / ein anderer test /"
Folgendes erhalten Sie, wenn Sie diesen Befehl ausführen.


Ein einfaches Sed-Call-Beispiel

In diesem Fall ersetzt sed das Wort "test" in der zur Bearbeitung übergebenen Zeile durch das Wort "another test". Zur Formatierung der Regel für die Verarbeitung von Text in Anführungszeichen werden Schrägstriche verwendet. In unserem Fall haben wir einen Befehl wie s / Muster1 / Muster2 / verwendet. Der Buchstabe "s" ist eine Abkürzung des Wortes "Ersatz", dh wir stehen vor einem Ersatzbefehl. Sed, das diesen Befehl ausführt, scannt den übertragenen Text und ersetzt die darin gefundenen Fragmente (über welche, wir weiter unten sprechen), die Muster1 entsprechen, durch Muster2.

Oben ist ein primitives Sed-Beispiel, um Sie auf den neuesten Stand zu bringen. Tatsächlich kann sed in viel komplexeren Textverarbeitungsszenarien verwendet werden, beispielsweise beim Arbeiten mit Dateien.

Unten sehen Sie eine Datei, die einen Text enthält, und die Ergebnisse der Verarbeitung mit diesem Befehl:

$ sed "s / test / anderer Test" ./myfile


Textdatei und Ergebnisse ihrer Verarbeitung

Dies ist der gleiche Ansatz, den wir oben verwendet haben, aber sed verarbeitet jetzt den in der Datei gespeicherten Text. Wenn die Datei jedoch groß genug ist, werden Sie feststellen, dass sed die Daten in Blöcken verarbeitet und das Verarbeitete auf dem Bildschirm ausgibt, ohne auf die Verarbeitung der gesamten Datei zu warten.

Sed ändert die Daten in der verarbeiteten Datei nicht. Der Editor liest die Datei, verarbeitet die gelesenen Daten und sendet die Ausgabe an STDOUT. Um sicherzustellen, dass sich die Originaldatei nicht verändert hat, genügt es, sie nach der Übergabe an sed zu öffnen. Bei Bedarf kann die Ausgabe von sed in eine Datei umgeleitet werden, wobei möglicherweise die alte Datei überschrieben wird. Wenn Sie einen der vorherigen Artikel dieser Serie kennen, der sich mit der Umleitung von Eingabe- und Ausgabeströmen befasst, sollten Sie in der Lage sein, dies zu tun.

Ausführen von Befehlssätzen beim Aufruf von sed

Um mehrere Aktionen für die Daten auszuführen, verwenden Sie beim Aufrufen von sed den Schalter -e. So arrangieren Sie beispielsweise das Ersetzen von zwei Textteilen:

$ sed -e "s / This / That /; s / test / other test /" ./myfile


Verwenden des Schalters -e beim Aufrufen von sed

Beide Befehle werden auf jede Textzeile in der Datei angewendet. Trennen Sie sie durch ein Semikolon, ohne Leerzeichen zwischen dem Ende des Befehls und dem Semikolon.
Um beim Aufruf von sed mehrere Muster der Textverarbeitung einzugeben, können Sie nach Eingabe des ersten einfachen Anführungszeichens die Eingabetaste drücken und dann jede Regel in einer neuen Zeile eingeben, wobei das abschließende Anführungszeichen nicht vergessen wird:

$ sed -e "> s / This / That /> s / test / other test /" ./myfile
Dies geschieht, nachdem der in diesem Formular dargestellte Befehl ausgeführt wurde.


Eine andere Möglichkeit, mit sed zu arbeiten

Befehle aus einer Datei lesen

Wenn Sie viele sed-Befehle zum Verarbeiten von Text haben, ist es normalerweise am besten, diese zuerst in eine Datei zu schreiben. Um die Datei anzugeben, die die Befehle für sed enthält, verwenden Sie den Schalter -f:

Hier ist der Inhalt der mycommands-Datei:

S / Dies / Das / s / Test / Anderer Test /
Rufen wir sed auf und übergeben die Befehlsdatei und die zu verarbeitende Datei an den Editor:

$ sed -f mycommands myfile
Das Ergebnis beim Aufrufen eines solchen Befehls ähnelt dem in den vorherigen Beispielen erhaltenen.


Verwenden einer Datei mit Befehlen beim Aufrufen von sed

Ersatzbefehlsflags

Schauen Sie sich das folgende Beispiel genau an.

$ sed "s / test / other test /" myfile
Dies ist, was in der Datei steht und was sed nach der Verarbeitung erhält.


Die Originaldatei und die Ergebnisse ihrer Verarbeitung

Der Ersetzungsbefehl verarbeitet normalerweise eine Datei, die aus mehreren Zeilen besteht, aber nur das erste Vorkommen des Suchtextes in jeder Zeile wird ersetzt. Um alle Vorkommen eines Musters zu ersetzen, müssen Sie das entsprechende Flag verwenden.

Das Schema zum Schreiben des Ersetzungsbefehls bei Verwendung von Flags sieht wie folgt aus:

S / Muster / Ersatz / Flaggen
Die Ausführung dieses Befehls kann auf verschiedene Weise geändert werden.

  • Beim Übertragen der Nummer wird die Sequenznummer des Vorkommens des Musters im String berücksichtigt, dieses Vorkommen wird ersetzt.
  • Das g-Flag gibt an, alle Vorkommen des Musters in der Zeichenfolge zu verarbeiten.
  • Das p-Flag gibt an, den Inhalt der ursprünglichen Zeichenfolge zu drucken.
  • Ein Flag der Form w file weist den Befehl an, die Ergebnisse der Textverarbeitung in eine Datei zu schreiben.
Betrachten Sie die Verwendung der ersten Variante des Ersetzungsbefehls, die die Position des ersetzten Vorkommens des gewünschten Fragments angibt:

$ sed "s / test / anderer Test / 2" myfile

Aufruf des Ersetzungsbefehls mit Angabe der Position des zu ersetzenden Fragments

Hier haben wir als Ersetzungsflag die Zahl 2 angegeben. Dies führte dazu, dass nur das zweite Vorkommen des gewünschten Musters in jeder Zeile ersetzt wurde. Probieren wir nun das globale Ersetzen-Flag - g aus:

$ sed "s / test / other test / g" myfile
Wie Sie an der Ausgabe sehen können, ersetzt dieser Befehl alle Vorkommen des Musters im Text.


Globaler Ersatz

Mit dem Ersetzungsbefehlsflag p können Sie übereinstimmende Zeilen drucken, aber die beim Aufrufen von sed angegebene Option -n unterdrückt die normale Ausgabe:

$ sed -n "s / test / other test / p" myfile
Dadurch werden beim Ausführen von sed in dieser Konfiguration nur die Zeilen (in unserem Fall eine Zeile) angezeigt, in denen das angegebene Textfragment gefunden wurde.


Verwenden des Befehlsflags p replace

Verwenden wir das w-Flag, mit dem wir die Ergebnisse der Textverarbeitung in einer Datei speichern können:

$ sed "s / test / other test / w output" myfile


Speichern von Textverarbeitungsergebnissen in einer Datei

Es ist deutlich zu erkennen, dass während der Ausführung des Kommandos die Daten nach STDOUT ausgegeben werden, während die verarbeiteten Zeilen in die Datei geschrieben werden, deren Name nach w angegeben wird.

Trennzeichen

Stellen Sie sich vor, Sie ersetzen / bin / bash durch / bin / csh in / etc / passwd. Die Aufgabe ist nicht so schwer:

$ sed "s / \ / bin \ / bash / \ / bin \ / csh /" / etc / passwd
Das alles sieht jedoch nicht sehr gut aus. Tatsache ist, dass, da Schrägstriche als Trennzeichen verwendet werden, dieselben Zeichen in den an sed übergebenen Zeilen maskiert werden müssen. Dadurch leidet die Lesbarkeit des Befehls.

Glücklicherweise erlaubt uns sed, die Trennzeichen für die Verwendung im Ersetzungsbefehl selbst zu definieren. Das Trennzeichen ist das erste Zeichen, das nach s angetroffen wird:

$ sed "s! / bin / bash! / bin / csh!" /etc/passwd
In diesem Fall wird ein Ausrufezeichen als Trennzeichen verwendet, dadurch ist der Code besser lesbar und sieht viel sauberer aus als zuvor.

Auswählen von Textfragmenten zur Verarbeitung

Bisher haben wir sed aufgerufen, um den gesamten an den Editor übergebenen Datenstrom zu verarbeiten. In einigen Fällen muss sed nur einen Teil des Textes verarbeiten – eine bestimmte Zeile oder Gruppe von Zeilen. Um dieses Ziel zu erreichen, können Sie zwei Ansätze verfolgen:
  • Legen Sie ein Limit für die Anzahl der verarbeiteten Zeilen fest.
  • Geben Sie den Filter an, für den Zeilen verarbeitet werden sollen.
Betrachten wir den ersten Ansatz. Hier sind zwei Möglichkeiten zulässig. Die erste, die im Folgenden betrachtet wird, sieht die Angabe der Nummer einer zu verarbeitenden Zeile vor:

$ sed "2s / test / other test /" myfile


Verarbeite nur eine Zeile, die beim Aufruf von sed angegebene Nummer

Die zweite Option ist eine Reihe von Zeichenfolgen:

$ sed "2,3s / test / anderer Test /" myfile


Umgang mit einer Reihe von Zeichenfolgen

Außerdem können Sie den Ersetzungsbefehl aufrufen, damit die Datei ab einer bestimmten Zeile bis zum Ende abgearbeitet wird:

$ sed "2, $ s / test / weiterer Test /" myfile


Verarbeitung einer Datei von der zweiten Zeile bis zum Ende

Um mit dem replace-Befehl nur Zeilen zu verarbeiten, die dem angegebenen Filter entsprechen, muss der Befehl wie folgt aufgerufen werden:

$ sed "/ likegeeks / s / bash / csh /" / etc / passwd
Ähnlich wie oben beschrieben wird das Muster vor dem Befehlsnamen s übergeben.


Verarbeiten von Zeilen, die einem Filter entsprechen

Wir haben hier einen sehr einfachen Filter verwendet. Um die Möglichkeiten dieses Ansatzes voll auszuschöpfen, können Sie reguläre Ausdrücke verwenden. Wir werden in einem der nächsten Materialien dieser Serie darüber sprechen.

Zeilen löschen

Sed eignet sich für mehr, als nur eine Zeichenfolge in Strings durch eine andere zu ersetzen. Mit seiner Hilfe, nämlich mit dem Befehl d, können Sie Zeilen aus dem Textstrom entfernen.

Der Befehlsaufruf sieht so aus:

$ sed "3d" myfile
Wir möchten, dass die dritte Zeile aus dem Text entfernt wird. Beachten Sie, dass dies keine Datei ist. Die Datei bleibt unverändert, das Löschen wirkt sich nur auf die Ausgabe aus, die sed erzeugt.


Entfernen der dritten Zeile

Wenn Sie beim Aufruf des d-Befehls die zu löschende Zeilennummer nicht angeben, werden alle Zeilen im Stream gelöscht.

So wenden Sie den Befehl d auf eine Reihe von Zeichenfolgen an:

$ sed "2,3d" myfile


Löschen eines Zeilenbereichs

Und so löschen Sie Zeilen, die mit der angegebenen bis zum Ende der Datei beginnen:

$ sed "3, $ d" meine Datei


Zeilen bis zum Ende der Datei löschen

Linien können auch nach Muster gelöscht werden:

$ sed "/test / d" myfile


Linien nach Muster löschen

Beim Aufruf von d können Sie einige Muster angeben - die Zeilen, in denen das Muster gefunden wird, und die dazwischen liegenden Zeilen werden gelöscht:

$ sed "/ zweite /, / vierte / d" myfile


Löschen eines Zeilenbereichs mithilfe von Vorlagen

Einfügen von Text in einen Stream

Mit sed können Sie mit den Befehlen i und a Daten in einen Textstream einfügen:
  • Der Befehl i fügt eine neue Zeile vor der angegebenen hinzu.
  • Der Befehl a fügt eine neue Zeile nach der angegebenen hinzu.
Sehen wir uns ein Beispiel für die Verwendung des i-Befehls an:

$ echo "Noch ein Test" | sed "i \ Erster Test"


Team i

Schauen wir uns nun den Befehl a an:

$ echo "Noch ein Test" | sed "a \ Erster Test"


Befehl a

Wie Sie sehen, fügen diese Befehle Text vor oder nach den Daten aus dem Stream hinzu. Was ist, wenn Sie irgendwo in der Mitte eine Zeile hinzufügen müssen?

Hier hilft uns die Angabe der Nummer der Referenzlinie im Stream oder der Vorlage. Beachten Sie, dass die Adressierung von Strings als Bereich hier nicht funktioniert. Rufen wir den Befehl i auf und geben die Zeilennummer an, vor der wir eine neue Zeile einfügen müssen:

$ sed "2i \ Dies ist die eingefügte Zeile." meine Datei


Ich befehle mit Referenzzeilennummer

Machen wir dasselbe mit dem a-Befehl:

$ sed "2a \ Dies ist die angehängte Zeile." meine Datei


Ein Befehl, der die Referenzzeilennummer angibt

Beachten Sie den Unterschied zwischen den Befehlen i und a. Die erste fügt eine neue Zeile vor der angegebenen ein, die zweite danach.

Ersetzen von Saiten

Mit dem Befehl c können Sie den Inhalt einer ganzen Textzeile in einem Datenstrom ändern. Beim Aufrufen müssen Sie die Leitungsnummer angeben, statt dessen müssen Sie dem Stream neue Daten hinzufügen:

$ sed "3c \ Dies ist eine modifizierte Zeile." meine Datei


Ersetzen einer ganzen Zeichenfolge

Wenn Sie beim Aufrufen eines Befehls ein Nur-Text- oder reguläres Ausdrucksmuster verwenden, werden alle Zeilen, die dem Muster entsprechen, ersetzt:

$ sed "/ Dies ist / c Dies ist eine geänderte Textzeile." meine Datei


Ersetzen von Strings durch Muster

Ersetzen von Zeichen

Der Befehl y bearbeitet einzelne Zeichen und ersetzt sie entsprechend den beim Aufruf übergebenen Daten:

$ sed "y / 123/567 /" myfile


Ersetzen von Zeichen

Wenn Sie diesen Befehl verwenden, müssen Sie berücksichtigen, dass er für den gesamten Textstrom gilt, Sie können ihn nicht auf bestimmte Vorkommen von Zeichen beschränken.

Zeilennummern anzeigen

Wenn Sie sed mit dem Befehl = aufrufen, gibt das Dienstprogramm die Zeilennummern im Datenstrom aus:

$ sed "=" meine Datei


Zeilennummern anzeigen

Der Streaming-Editor druckte Zeilennummern vor ihren Inhalt.

Wenn Sie diesem Befehl ein Muster übergeben und den Schalter sed -n verwenden, werden nur die Zeilennummern ausgegeben, die dem Muster entsprechen:

$ sed -n "/ test / =" meine Datei


Zeilennummern mit passendem Muster drucken

Lesen von Daten zum Einfügen aus einer Datei

Oben haben wir uns Techniken zum Einfügen von Daten in einen Stream angesehen, wobei wir direkt beim Aufruf von sed angeben, was eingefügt werden soll. Sie können auch eine Datei als Datenquelle verwenden. Verwenden Sie dazu den Befehl r, mit dem Sie Daten aus der angegebenen Datei in den Stream einfügen können. Beim Aufruf können Sie die Zeilennummer angeben, nach der Sie den Inhalt der Datei oder eine Vorlage einfügen müssen.

Betrachten wir ein Beispiel:

$ sed "3r newfile" myfile


Einfügen von Dateiinhalten in einen Stream

Hier wurde der Inhalt von newfile nach der dritten Zeile von myfile eingefügt.

Folgendes passiert, wenn Sie das Muster beim Aufrufen von r anwenden:

$ sed "/test / r newfile" myfile


Verwenden einer Vorlage beim Aufruf des r-Befehls

Der Inhalt der Datei wird nach jeder Zeile eingefügt, die dem Muster entspricht.

Beispiel

Stellen wir uns folgende Aufgabe vor. Es gibt eine Datei, in der eine bestimmte, an sich bedeutungslose Zeichenfolge vorhanden ist, die durch Daten aus einer anderen Datei ersetzt werden muss. Es sei nämlich die Datei newfile, in der die DATA-Zeichenfolge als Platzhalter fungiert. Die für DATA zu ersetzenden Daten werden in den Daten gespeichert.

Sie können dieses Problem mit den Befehlen r und d des Stream-Editors sed lösen:

$ Sed "/ DATA> / (r newfile d)" myfile


Ersetzen des Ortsindikators durch echte Daten

Wie Sie sehen, hat sed der Ausgabe anstelle des Platzhalters DATA zwei Zeilen aus der Datendatei hinzugefügt.

Ergebnisse

Heute haben wir die Grundlagen der Arbeit mit dem sed-Stream-Editor behandelt. Tatsächlich ist Sed ein riesiges Thema. Das Erlernen kann mit dem Erlernen einer neuen Programmiersprache verglichen werden, aber sobald Sie die Grundlagen verstanden haben, sollten Sie in der Lage sein, sed auf jedem Niveau zu beherrschen, das Sie benötigen. Dadurch sind Ihre Möglichkeiten, Texte damit zu bearbeiten, nur durch Ihre Vorstellungskraft begrenzt.

Das ist alles für heute. Lassen Sie uns das nächste Mal über die Datenverarbeitungssprache awk sprechen.

Liebe Leser! Verwenden Sie sed in Ihrer täglichen Arbeit? Wenn ja, teile bitte deine Erfahrungen.

Viele von euch haben den Stream-Texteditor sed wahrscheinlich für einige ihrer eigenen Zwecke verwendet, wenn nicht, erzähle ich Ihnen gerne davon, ich werde es genauer versuchen. Warum heißt es Streaming? Die Antwort ist einfach - stellen Sie sich ein Eingabetextdokument vor, das das Programm durchläuft, und als Ergebnis erhalten Sie eine andere Form dieser Datei, die vom Programm verarbeitet wird. Eine Art Fleischwolf - Sie legen Fleisch anhand des Gitters an - Sie erhalten entweder Hackfleisch oder etwas anderes.

Standardmäßig sollte sich dieses Dienstprogramm also bereits auf Ihrem System befinden (in meinem Fall hatte ich es in Debian 7.6 bereits), wenn nicht, dann -

Mit Text:

der Parameter "s" am Anfang gibt an, dass der Text ersetzt werden muss, g - am Ende des ersetzten Textes - was global (in der gesamten Datei) zu tun ist

Wir möchten zum Beispiel das Wort Sergey in unserer Datei text.txt durch Andrey ersetzen und dies alles in die Datei textout.txt hochladen.

sed "s / Sergey / Andrey / g" Text. txt> Textausgabe. TXT

Ergebnis:

Wenn Sie Sonderzeichen ersetzen möchten - zum Beispiel für das &-Zeichen, dann müssen Sie vor dem Sonderzeichen. fügen Sie einen Backslash "\" mit einem Zeichen ein. Wenn Sie angeben müssen, was sed zum Anfang einer Zeile benötigt, verwenden Sie das Sonderzeichen "^". Darüber hinaus können Sie 2 oder mehr Änderungen in eine Zeile schreiben und sie durch ein Semikolon - ";" trennen. Wir quälen zum Beispiel die bereits geänderte Datei textout.txt. Zuerst zeige ich noch einmal den aktuellen Inhalt der Datei textout.txt:

root @ testhostname: ~ # cat textout.txt

Test für Andrey

Test 2 für Andrey

Test 3 für Andrey

Nun geben wir den Befehl ein:

sed "s / for / \ & / g; s / ^ Test / Sergey / g" Textausgabe. txt> Textausgabe2. TXT

Anstelle des Wortes für setzen wir also das &-Icon (das Sonderzeichen wird mit dem "\" vor das Sonderzeichen eingegeben), dann das Trennzeichen (damit alle Änderungen in eine sed-Zeile geschrieben werden können -> ";", anstelle des Wortes am Anfang der Zeile "Test" setzen Sie das Wort Sergey, das Ergebnis dessen, was passiert ist:

Alles wie wir wollten!

Auch sed ist ein guter Helfer zum Anzeigen von Protokollen. Zum Beispiel müssen wir alle Zeilen des heutigen Datums (in unserem Fall ist es der 10. Oktober) aus der Protokolldatei / var / log / Messages in die Datei testlog.txt entladen, fahren wir fort:

sed - n "/ ^ 10. Okt. / p" / var / log / Nachrichten> testlog. TXT

hier haben wir den Parameter -n hinzugefügt, und dann - '/ ^ 10. Oktober / - dies bedeutet, dass die Zeile mit dem Datum vom 10. Oktober beginnen sollte, dann der Parameter p - was bedeutet print (den Inhalt unter dieser Bedingung drucken), dann die Quelldatei und die Datei, in der wir uns befinden Lassen Sie uns die Ergebnisse für unsere Filterbedingung wegwerfen, führen Sie sie aus, sehen Sie, was die Datei testlog.txt exklusiv am 10. Oktober enthält:

Bußgeld! Wenn Sie nicht viele Zeilen benötigen, aber bedingt nur von der ersten bis zur fünften Zeile nehmen müssen, trennen wir unsere aktuelle Abfrage mit dem "|" Entfernen Sie das Entladen in die Datei testlog.txt und schreiben Sie sed -n 1,5p - was bedeutet, dass wir drucken müssen (p - am Ende des Ausdrucks drucken) von der ersten "1" bis (durch Kommas getrennt) der fünften Zeile "5". Insgesamt erhalten wir so etwas:

sed - n "/ ^ 10. Oktober / p" / var / log / Nachrichten | sed - n 1, 5p> testlog - 5strok.txt

Ich mache Sie noch einmal darauf aufmerksam, dass die Datei, in der wir die Ergebnisse hochladen, ans Ende verschoben wird (testlog-5strok.txt), wir sehen das Ergebnis unserer Aktionen:

Der Stream-Editor sed ist ein nicht interaktiver Texteditor, der mit Daten aus der Standardeingabe oder aus einer Datei arbeitet. Sed bearbeitet die Informationen Zeile für Zeile.

In hat die Grundlagen der Arbeit mit dem sed-Editor behandelt. Dieser Leitfaden behandelt fortgeschrittenere Techniken.

Teams kombinieren

Manchmal ist es notwendig, mehrere Befehle gleichzeitig an den sed-Editor zu übergeben. Dies geschieht auf mehrere Arten.

Wenn Sie noch keine sed-Testdatei haben, erstellen Sie die folgende Umgebung:

CD
cp/usr/share/common-licenses/BSD.
cp / usr / Share / Common-Lizenzen / GPL-3.
echo "Dies ist das Lied, das niemals endet


nicht wissen was es war

nur weil ... "> nervig.txt

Da sed mit Standard-Ein- und -Ausgabe arbeitet, können Sie die verschiedenen sed-Befehle natürlich auch einfach in einer Zeile zusammen aufrufen:

sed "s / und / \ & /" nervig.txt | sed "s / Menschen / Pferde /"

Ja, es geht weiter und weiter, mein Freund
einige Pferde fingen an es zu singen
nicht wissen was es war
& sie werden es für immer weiter singen
nur weil ...

Dies funktioniert, aber mehrere Aufrufe von sed sind Overhead, nehmen mehr Platz ein und verwenden nicht die integrierten Funktionen von sed.

Sie können mehrere Befehle gleichzeitig an sed übergeben, indem Sie die Option –e verwenden, die vor jedem Befehl eingefügt werden muss:

sed -e "s / und / \ & /" -e "s / Menschen / Pferde /" nerven.txt

Sie können Befehle auch mit dem Semikolon-Zeichen zu einer Zeichenfolge verketten. Diese Methode funktioniert genauso wie die vorherige.

sed "s / und / \ & /; s / Menschen / Pferde /" nervig.txt

Beachten Sie, dass es bei Verwendung des Flags –e erforderlich ist, einfache Anführungszeichen zu unterbrechen, und bei Verwendung eines Semikolons können alle Befehle in einfache Anführungszeichen gesetzt werden.

Diese beiden Methoden zum gleichzeitigen Aufrufen mehrerer Befehle sind recht praktisch, aber manchmal müssen Sie eine einfache Befehlszeile verwenden.

Sie sollten sich auch mit dem Operator = vertraut machen. Diese Anweisung fügt eine Zeilennummer zwischen jede vorhandene Zeile ein. Das Ergebnis sieht so aus:

sed "=" nervig.txt
1
das ist das lied das niemals endet
2
Ja, es geht immer weiter, mein Freund
3
einige Leute haben angefangen es zu singen
4
nicht wissen was es war
5
und sie werden es für immer weiter singen
6
nur weil ...

Versuchen Sie nun, den Text zu bearbeiten, um zu sehen, wie sich das Nummerierungsformat ändert.

Der G-Befehl fügt standardmäßig eine Leerzeile zwischen bestehenden Zeilen ein.

sed "G" nervig.txt
_
das ist das lied das niemals endet
_
Ja, es geht immer weiter, mein Freund
_
einige Leute haben angefangen es zu singen
_
nicht wissen was es war
_
und sie werden es für immer weiter singen
_
nur weil ...

Versuchen Sie, beides zu kombinieren. Auf den ersten Blick könnte es so aussehen, als ob die Ausgabe dieser Befehle eine Leerzeile zwischen der Textzeile und der nummerierten Zeile enthält. Die Ausgabe sieht jedoch so aus:

sed "=; G" nervig.txt
1
das ist das lied das niemals endet
_
2
Ja, es geht immer weiter, mein Freund
_
3
einige Leute haben angefangen es zu singen
_
4
nicht wissen was es war
. . .
. . .

Dies liegt daran, dass der =-Operator den Ausgabestrom ändert (das bedeutet, dass Sie die resultierende Ausgabe nicht für die weitere Bearbeitung verwenden können).

Dies kann mit zwei Aufrufen von sed umgangen werden, wobei der erste Aufruf für den zweiten als einfacher Textstrom behandelt wird.

sed "=" nervig.txt | sed "G"
1
_
das ist das lied das niemals endet
_
2
_
Ja, es geht immer weiter, mein Freund
_
3
_
einige Leute haben angefangen es zu singen
. . .
. . .

Beachten Sie, dass einige der Befehle ähnlich funktionieren, insbesondere wenn Sie mehrere Befehle verketten und die Ausgabe nicht Ihren Erwartungen entspricht.

Erweiterte Adressierung

Einer der Vorteile der adressierbaren Befehle von sed besteht darin, dass sie reguläre Ausdrücke als Kriterien verwenden können. Das bedeutet, dass Sie mit Dateien arbeiten können, deren Inhalt nicht genau bekannt ist.

sed "1,3s /.*/ Hallo /" nervig.txt
Hallo
Hallo
Hallo
nicht wissen was es war
und sie werden es für immer weiter singen
nur weil ...

Stattdessen können Sie einen regulären Ausdruck verwenden, der nur mit Zeichenfolgen übereinstimmt, die ein bestimmtes Muster enthalten. Dazu müssen Sie das Suchmuster zwischen den beiden Schrägstrichen (/) vor dem Befehl platzieren.

sed "/ singen / s / es / & laut /" nervig.txt
das ist das lied das niemals endet
Ja, es geht immer weiter, mein Freund
Einige Leute fingen an, es laut zu singen
nicht wissen was es war
und sie werden es für immer laut singen
nur weil ...

In diesem Beispiel wird das Wort laut in jeder Zeile, die das Wort Singen enthält, vor das erste gesetzt. Bitte beachten Sie, dass die zweite und vierte Zeile unverändert bleiben, da sie nicht zum Muster passen.

Ausdrücke zur Adressierung können kompliziert sein. Das macht die Teams flexibler.

Das folgende Beispiel zeigt, wie Sie mit regulären Ausdrücken Adressen für andere Befehle generieren. Dieser Befehl findet alle leeren Zeilen und entfernt sie:

sed "/ ^ $ / d" GPL-3
GNU ALLGEMEINE ÖFFENTLICHE LIZENZ
Version 3, 29. Juni 2007
Copyright (C) 2007 Free Software Foundation, Inc.
Jeder darf wörtliche Kopien kopieren und verteilen
dieses Lizenzdokuments, aber es ist nicht erlaubt, es zu ändern.
Präambel
Die GNU General Public License ist eine kostenlose Copyleft-Lizenz für
. . .
. . .

Beachten Sie, dass reguläre Ausdrücke überall im Bereich verwendet werden können.

Sie können beispielsweise die Zeilen zwischen den Zeilen START und END löschen:

sed "/ ^ START $ /, / ^ END $ / d" Eingabedatei

Denken Sie daran: Dieser Befehl löscht alle Zeilen vom ersten gefundenen Wort START bis zum ersten gefundenen Wort END, und wenn er dann wieder auf das Wort START trifft, fährt er mit dem Löschen von Daten fort.

Um die Adressierung umzukehren (dh Zeilen auszuwählen, die nicht dem Muster entsprechen), verwenden Sie ein Ausrufezeichen (!).

Um beispielsweise eine gefüllte Zeile zu löschen, geben Sie Folgendes ein:

sed "/ ^ $ /! d" GPL-3

Die Adresse muss kein komplexer Ausdruck sein, um invertiert zu werden. Die Umkehrung funktioniert auf die gleiche Weise mit der normalen Nummerierung.

Verwendung eines zusätzlichen Puffers

Der Haltepuffer erhöht die Fähigkeit von sed, mehrzeilige Bearbeitungen durchzuführen.

Ein zusätzlicher Puffer ist ein temporärer Speicherbereich, der durch bestimmte Befehle geändert werden kann.

Mit diesem zusätzlichen Puffer können Zeichenfolgen gespeichert werden, während an anderen Zeichenfolgen gearbeitet wird.

Pufferbefehle:

  • h: Kopiert den aktuellen Verarbeitungspuffer (die letzte übereinstimmende Zeile, an der Sie arbeiten) in einen zusätzlichen Puffer.
  • H: Fügt den aktuellen Verarbeitungspuffer am Ende der aktuellen zusätzlichen Verarbeitung hinzu und trennt sie mit \ n.
  • g: Kopiert den aktuellen zusätzlichen Puffer in den aktuellen Verarbeitungspuffer. Der bisherige Verarbeitungspuffer geht verloren.
  • G: Fügt die aktuelle Vorlage zum aktuellen Verarbeitungspuffer hinzu und begrenzt sie mit \ n.
  • x: Tauschen Sie die aktuelle Vorlage und zusätzlichen Puffer aus.

Der Inhalt des zusätzlichen Puffers kann nicht manipuliert werden, bis er in den Verarbeitungspuffer verschoben wird.

Schauen wir uns ein komplexes Beispiel an.

Versuchen Sie, benachbarte Zeilen mit dem folgenden Befehl zu verketten:

sed -n "1 ~ 2h; 2 ~ 2 (H; g; s / \ n / /; p)" nervig.txt


Notiz: Tatsächlich bietet sed dafür einen separaten eingebauten N-Befehl; aber für die Praxis ist es nützlich, dieses Beispiel zu betrachten.

Die Option –n unterdrückt die automatische Ausgabe.

1 ~ 2h ist eine Adressdefinition, die sequentiell jede zweite Textzeile ersetzt, beginnend mit der ersten (dh jede ungerade Zeile). Der Befehl h kopiert die übereinstimmenden Zeilen in einen zusätzlichen Puffer.

Der Rest des Befehls ist in geschweifte Klammern eingeschlossen. Dies bedeutet, dass dieser Teil des Befehls die soeben angegebene Adresse erbt. Ohne diese Klammern erbt nur der H-Befehl die Adresse, und der Rest der Befehle wird für jede Zeile ausgeführt.

Natürlich ist der zuvor erwähnte eingebaute N-Befehl erheblich kürzer und einfacher und liefert das gleiche Ergebnis:

sed -n "N; s / \ n / / p" nervig.txt
Das ist das Lied, das niemals endet, ja, es geht weiter und weiter, mein Freund
Einige Leute fingen an, es zu singen, ohne zu wissen, was es war
und sie "werden es für immer weiter singen, nur weil ...

Sed-Skripte

Befehle können zu Skripten zusammengefasst werden. Auf diese Weise können Sie einen ganzen Satz von Befehlen auf einer einzigen Zielvorlage ausführen.

Sie können beispielsweise ein Skript schreiben, um einfache Textnachrichten zu erstellen, die Sie zuvor formatieren müssen.

Auf diese Weise müssen Sie nicht für jede Nachricht dieselben Befehle wiederholen. Grundsätzlich ist ein sed-Skript eine Liste von Befehlen, die auf ein bestimmtes Objekt angewendet werden sollen.

Zum Beispiel:

s / dies / das / g
s / Schnee / Regen / g
1,5s / Tannenzapfen / Aprikose / g

Dann kann die Datei aufgerufen werden:

sed -f sedScriptName fileToEdit

Abschluss

Sie kennen jetzt fortgeschrittene Sed-Techniken.

Sed-Befehle sind anfangs schwer zu verstehen und leicht zu verwechseln. Daher wird empfohlen, mit ihnen zu experimentieren, bevor Sie sie für wichtige Daten verwenden.

Stichworte:,
Fortsetzung des Themas:
Router

Moderne Daten- und Sprachanwendungen wie Gigabit-Ethernet zum Desktop werden in die Kategorie 5e eingestuft. Diese Lösung hat die erforderlichen Eigenschaften ...