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.
$ 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.
$ 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.
$ 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.
$ 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.
$ 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.
$ 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:,