Sed
Paradigma | Scripting |
---|---|
Entworfen von | Lee E. McMahon |
Erstmals erschienen | 1974 |
Implementierungssprache | C |
Webseite | www |
Beeinflusst von | |
ed | |
Beeinflusst | |
Perl, Awk |
sed ("Stream Editor") ist a Unix Dienstprogramm, das Text analysiert und verändert, wobei eine einfache, kompakte Programmiersprache verwendet wird. SED wurde von 1973 bis 1974 von entwickelt von Lee E. McMahon von Bell Labs,[1] und ist heute für die meisten Betriebssysteme erhältlich.[2] SED basierte auf den Skriptfunktionen des interaktiven Editors ed ("Editor", 1971) und die früheren Qed ("Quick Editor", 1965–66). SED war eines der frühesten Werkzeuge zur Unterstützung Reguläre Ausdrückeund bleibt für die Textverarbeitung verwendet, insbesondere mit dem Substitutionsbefehl. Beliebte alternative Tools für die Manipulation der Klartext -String und die "Stream -Bearbeitung" inklusive Awk und Perl.
Geschichte
Zuerst erscheinen in Version 7 Unix,[3] SED ist einer der frühen Unix -Befehle, die für die Befehlszeilenverarbeitung von Datendateien erstellt wurden. Es entwickelte sich als natürlicher Nachfolger des Volks Grep Befehl.[4] Die ursprüngliche Motivation war ein Analogon von Grep (g/re/p) zur Substitution, daher "g/re/s".[3] McMahon sagte, dass auch weitere Sonderprogramme für jeden Befehl entstehen würden, wie z.[4] Die Syntax für SED, insbesondere die Verwendung von /
zum Musteranpassung, und s///
zur Substitution, Ursprung von ed, der Vorläufer von SED, der zu dieser Zeit gemeinsam verwendet wurde,[4] und die reguläre Expressionssyntax hat andere Sprachen insbesondere beeinflusst ECMaskript und Perl. Später die mächtigere Sprache Awk entwickelt, und diese fungierten als Cousins, sodass eine leistungsstarke Textverarbeitung durchgeführt werden kann Shell -Skripte. SED und awk werden oft als Vorläufer und Inspiration für Perl zitiert und beeinflussten die Syntax und Semantik von Perl, insbesondere bei den Matching- und Substitutionsbetreibern.
GNU SED fügte mehrere neue Funktionen hinzu, einschließlich Einstellungsbearbeitung von Dateien. Super-Sed ist eine erweiterte Version von SED, die reguläre Ausdrücke enthält, die mit kompatibel ist Perl. Eine andere Variante von SED ist abgeblendet, ursprünglich umgekehrt von 4,1bsd sed durch Eric S. Raymond und derzeit unterhalten von René Rebe. abgestimmt wurde von der genutzt GNU -Projekt Bis das GNU -Projekt eine neue Version von SED basierte, die auf der neuen GNU regulären Ausdrucksbibliothek basiert. Der abgesetzte Strom enthält einige Erweiterungen zu BSD SED, ist aber nicht als so feature-reichen als gnu sed. Sein Vorteil ist, dass es sehr schnell ist und wenig Speicher verwendet. Es wird auf eingebetteten Systemen verwendet und ist die Version von SED, die mit zur Verfügung gestellt werden Minix.
Arbeitsweise
SED ist ein zeilenorientiertes Dienstprogramm für Textverarbeitung: Es liest Text, Zeile für Zeile von einem Eingabestrom oder Datei in einen internen Puffer namens die Musterraum. Jede Lektüre startet a Kreislauf. Auf den Musterraum wendet SED einen oder mehrere Operationen an, die über a angegeben wurden sed skript. SED implementiert a Programmiersprache mit ungefähr 25 Befehle Dadurch werden die Vorgänge im Text angegeben. Für jede Eingangszeile gibt SED nach dem Ausführen des Skripts normalerweise den Musterraum (die vom Skript geänderte Zeile) aus und beginnt den Zyklus erneut mit der nächsten Zeile. Andere Verhaltensweisen am Ende des Schriftens sind über SED-Optionen und Skriptbefehle verfügbar, z. d
Um den Musterraum zu löschen, q
beenden, N
So fügen Sie die nächste Zeile dem Musterraum sofort und so weiter hinzu. Somit entspricht ein SED -Skript dem Körper einer Schleife, die durch die Linien eines Streams iteriert, wobei die Schleife selbst und die Schleifenvariable (die aktuelle Linienzahl) implizit und von SED aufrechterhalten werden.
Das SED -Skript kann entweder auf dem angegeben werden Befehlszeile (-e
Option) oder aus einer separaten Datei lesen (-f
Möglichkeit). Befehle im SED -Skript können optional sein die Anschrift, in Bezug auf Zeilennummern oder Reguläre Ausdrücke. Die Adresse bestimmt, wann der Befehl ausgeführt wird. Zum Beispiel, 2d
würde das nur laufen lassen d
(löschen) Befehl in der zweiten Eingabestelle (drucken Sie alle Zeilen außer der zweiten), während /^ /d
Würde alle Zeilen löschen, die mit einem Raum beginnen. Ein separater Spezialpuffer, der Raum haltenkann von einigen SED -Befehlen verwendet werden, um Text zwischen den Zyklen zu halten und zu akkumulieren. Seds Befehlssprache hat nur zwei Variablen (den "Raum halten" und den "Musterraum") und GEHE ZU-ähnliche Verzweigungsfunktionen; Trotzdem ist die Sprache Turing-Complete,[5][6] und Esoterisch SED -Skripte existieren für Spiele wie Sokoban, Arkanoid,[7] Schach,[8] und Tetris.[9]
A Hauptschleife Fügt sich für jede Zeile des Eingabestreams aus und bewertet das SED -Skript in jeder Zeile der Eingabe. Linien eines SED-Skripts sind jeweils ein Muster-Action-Paar, das angibt, welches Muster übereinstimmt und welche Aktion ausführen soll, die als neu umgerichtet werden können Bedingte Aussage. Da die Hauptschleife, Arbeitsvariablen (Musterraum und Halteplatz), Eingabe- und Ausgabeströme sowie Standardaktionen (Zeile zum Musterraum, Druckmusterraum) implizit sind, ist es möglich, TERSE zu schreiben Ein-Liner-Programme. Zum Beispiel das SED -Programm gegeben von:
10q
Drucken Sie die ersten 10 Eingangszeilen und stoppen dann.
Verwendungszweck
Substitutionskommando
Das folgende Beispiel zeigt eine typische und häufigste Verwendung von SED: Substitution. Diese Verwendung war in der Tat die ursprüngliche Motivation für SED:[4]
sed 's/regexp/Ersatz/g' InputFileName> outputFileName
In einigen Versionen von SED muss dem Ausdruck von vorangegangen sein -e
um anzuzeigen, dass ein Ausdruck folgt. Das s
steht für Ersatz, während die g
steht für Global, was bedeutet, dass alle übereinstimmenden Ereignisse in der Linie ersetzt würden. Das regulären Ausdruck (d. H. Muster) zu suchen wird nach dem ersten abgrenzenden Symbol (Schrägstrich hier) platziert, und der Ersatz folgt dem zweiten Symbol. Schrägstrich (/
) ist das herkömmliche Symbol, das aus dem Zeichen für "Suche" in ED stammt, aber jeder andere könnte verwendet werden, um die Syntax lesbarer zu machen, wenn es nicht im Muster oder Ersatz auftritt. Dies ist nützlich zu vermeiden "Lieger Zahnstocher -Syndrom".
Der Substitutionsbefehl, der in Such- und Wiederherstellung in ED stammt, implementiert eine einfache Parsen und Vorlagen. Das Regexp
Bietet sowohl Musteranpassung als auch Speichern von Text über Subexpressionen, während die Ersatz
Kann entweder einen wörtlichen Text oder eine Formatzeichenfolge sein, die die Zeichen enthält &
Für "gesamte Match" oder das Special Fluchtsequenzen \1
durch \9
für die nTH gerettete Unterexpression. Zum Beispiel, sed -r "s/(cat | hunde) s?/\ 1s/g"
Ersetzt alle Vorkommen von "Katze" oder "Hund" durch "Katzen" oder "Hunde", ohne ein bestehendes "S" zu duplizieren: (Katze | Hund)
ist der 1. (und nur) gespeicherte Unterexpression im Regexp, und \1
In der Format -Zeichenfolge ertönt dies in die Ausgabe.
Andere SED -Befehle
Neben der Substitution sind andere Formen der einfachen Verarbeitung möglich, wobei etwa 25 SED -Befehle verwendet werden. Zum Beispiel verwendet Folgendes die d Befehl zum herausfilterten Zeilen, die nur Leerzeichen enthalten, oder nur das Ende des Zeilenzeichens enthalten:
sed '/^ *$/d' InputFileName
Dieses Beispiel verwendet einige der folgenden regulären Ausdruck Metacharaccters (SED unterstützt den gesamten Bereich der regulären Ausdrücke):
- Das Pflege (
^
) entspricht dem Beginn der Linie. - Das Dollarzeichen (
$
) entspricht dem Ende der Linie. - Das Sternchen (
*
) entspricht Null oder mehr Vorkommen des vorherigen Charakters. - Das Plus (
+
) entspricht einem oder mehreren Vorkommen des vorherigen Charakters. - Das Fragezeichen (
?
) entspricht Null oder einem Auftreten des vorherigen Charakters. - Das Punkt (
.
) entspricht genau einem Charakter.
Komplexe SED -Konstrukte sind möglich, sodass es als einfaches, aber hochspezialisiertes dienen kann. Programmiersprache. Der Kontrollfluss kann beispielsweise durch die Verwendung von a verwaltet werden Etikett (ein Dickdarm, gefolgt von einer Schnur) und der Zweiganweisung b
. Eine Anweisung b
Anschließend wird ein gültiger Etikettsname die Verarbeitung in den Block bewegt, folgt diesem Etikett.
SED als Filter verwendet
Unter Unix wird SED oft als verwendet Filter in einem Pipeline:
generiert | sed 's/x/y/g'
Das heißt, ein Programm wie "generatedata" generiert Daten, und dann führt SED die geringe Änderung des Austauschs vor x mit y. Zum Beispiel:
$ Echo xyz xyz | sed 's/x/y/g' yyz yyz
Dateibasierte SED-Skripte
Es ist oft nützlich, mehrere SED -Befehle, einen Befehl pro Zeile, in eine Skriptdatei wie z. ersetzt
, und dann verwenden Sie die -f
Option zum Ausführen der Befehle (z. s/x/y/g
) aus der Datei:
SED -F -Subst. -SED -InputFileName> outputFileName
Eine beliebige Anzahl von Befehlen kann in die Skriptdatei eingebaut werden, und die Verwendung einer Skriptdatei vermeidet auch Probleme mit der Enteibe oder Ersatzs von Shell.
Eine solche Skriptdatei kann direkt aus der Befehlszeile ausführbar gemacht werden, indem sie sie mit einem "vorbereitet"Shebang Zeile "Enthält den SED ersetzt
Kann mit Inhalten erstellt werden:
#!/bin/sed -f s/x/y/g
Die Datei kann dann vom aktuellen Benutzer mit dem ausführbar gemacht werden Chmod
Befehl:
chmod u+x sub.sed.
Die Datei kann dann direkt aus der Befehlszeile ausgeführt werden:
sub.sed InputFileName> outputFileName
Einstellungsbearbeitung
Das -ich
Die in gnu sed eingeführte Option ermöglicht die Einstellung von Dateien (tatsächlich wird eine temporäre Ausgabedatei im Hintergrund erstellt, und dann wird die Originaldatei durch die temporäre Datei ersetzt). Zum Beispiel:
sed -i 's/abc/def/' Dateiname
Beispiele
Hallo Welt! Beispiel
# Eingabetextstrom in "Hallo, Welt!" s /.*/ Hallo, Welt!/Q.
Dies "Hallo Welt!" Das Skript befindet sich in einer Datei (z. B. script.txt) und aufgerufen mit sed -f script.txt InputFileName
, wobei "InputFileName" die Eingabetextdatei ist. Das Skript ändert "InputFileName" Zeile 1 in "Hallo, Welt!" und beendet dann und druckt das Ergebnis, bevor SED ausgeht. Alle Eingangsleitungen nach Zeile Nr. 1 werden nicht gelesen und nicht gedruckt. Die einzige Ausgabe ist also "Hallo, Welt!".
Das Beispiel betont viele Schlüsselmerkmale von SED:
- Typische SED -Programme sind ziemlich kurz und einfach.
- SED -Skripte können Kommentare haben (die Zeile beginnt mit dem
#
Symbol). - Das
s
(Ersatz) Befehl ist der wichtigste SED -Befehl. - SED ermöglicht eine einfache Programmierung mit Befehlen wie z.
q
(Verlassen). - SED verwendet regelmäßige Ausdrücke, wie z.
.*
(Null oder mehr von jedem Charakter).
Andere einfache Beispiele
Folgen Sie unten verschiedene SED -Skripte; Diese können ausgeführt werden, indem sie als Argument für SED bestanden oder in eine separate Datei eingesetzt und über übertragen werden -f
oder indem Sie das Skript selbst ausführbar machen.
Um eine Instanz eines bestimmten Wortes in einer Datei durch "reduziert" zu ersetzen, z. B. ein IRC -Passwort, speichern Sie das Ergebnis:
sed -i s/yourpassword/redigiert/./status.chat.log
So löschen Sie jede Zeile mit dem Wort "Ihr Wort" (das die Anschrift ist '/yourwort/'):
/ Ihr Wort/ d
So löschen Sie alle Instanzen des Wortes "Ihr Wort":
S/Ihr Wort // g
So löschen Sie zwei Wörter aus einer Datei gleichzeitig:
S/Firstword // g s/zweitwortwort // g
Um das vorherige Beispiel in einer Zeile auszudrücken, z. B. beim Eingeben in die Befehlszeile, kann man zwei Befehle über das Semikolon verbinden:
sed "S/Firstword // g; s/secondwort // g" InputFileName
Beispiel für Multiline -Verarbeitung
Im nächsten Beispiel entzieht SED, das normalerweise nur in einer Zeile funktioniert, Neuleitungen aus Sätzen, bei denen die zweite Zeile mit einem Raum beginnt. Betrachten Sie den folgenden Text:
Dies ist mein Hund, dessen Name Frank ist. Dies ist mein Fisch, dessen Name George ist. Dies ist meine Ziege, deren Name Adam ist.
Das SED -Skript unten verwandelt den obigen Text in den folgenden Text. Beachten Sie, dass das Skript nur die Eingabestellen betrifft, die mit einem Speicherplatz beginnen:
Dies ist mein Hund, dessen Name Frank ist. Dies ist mein Fisch, dessen Name George ist. Dies ist meine Ziege, deren Name Adam ist.
Das Skript ist:
N s / \ n / / p d
Dies wird erklärt als:
- (
N
) Fügen Sie die nächste Zeile zum Musterraum hinzu; - (
s / \ n / / / / / / / / / / / /
) Finden Sie eine neue Linie, gefolgt von einem Raum, ersetzen Sie sie durch einen Raum. - (
P
) Drucken Sie die obere Linie des Musterraums; - (
D
) Löschen Sie die obere Zeile aus dem Musterraum und führen Sie das Skript erneut aus.
Dies kann über Semikolons auf einer einzigen Linie ausgedrückt werden:
sed 'n; s /\ n / /; P; D 'InputFileName
Einschränkungen und Alternativen
Während SED einfach und begrenzt ist, ist SED für eine große Anzahl von Zwecken ausreichend leistungsfähig. Für eine ausgefeiltere Verarbeitung, leistungsfähigere Sprachen wie Awk oder Perl werden stattdessen verwendet. Diese werden besonders verwendet, wenn eine Linie in gewisser Weise komplizierter wird als ein Regex -Extrahierungs- und Vorlagenersatz, obwohl willkürlich komplizierte Transformationen durch Verwendung des Hold -Puffer im Prinzip möglich sind.
Umgekehrt für einfachere Operationen, spezialisierte UNIX -Dienstprogramme wie z. Grep (Drucklinien, die einem Muster entsprechen), Kopf (Drucken Sie den ersten Teil einer Datei), Schwanz (Drucken Sie den letzten Teil einer Datei) und tr (Übersetzen oder Löschen von Zeichen) sind oft vorzuziehen. Für die spezifischen Aufgaben, die sie ausführen sollen, sind solche speziellen Versorgungsunternehmen normalerweise einfacher, klarer und schneller als eine allgemeinere Lösung wie SED.
Die ED/SED -Befehle und die Syntax werden weiterhin in Abstiegsprogrammen verwendet, wie z. B. die Textredakteure vi und Vim. Ein Analogon zu ED/SED ist Sam/ssam, wo sam der ist Plan 9 Editor und SSAM sind eine Stream -Schnittstelle dazu, die eine Funktionsfähigkeit wie SED ergibt.
Siehe auch
Anmerkungen
- ^ Bei der Verwendung von Befehlszeilen sind die Zitate um den Ausdruck nicht erforderlich und nur dann erforderlich, wenn die Shell den Ausdruck sonst nicht als einzelnes Wort (Token) interpretieren würde. Für das Skript
s/x/y/g
Es gibt keine Unklarheit, alsogeneriertata | sed s/x/y/g
funktioniert richtig. Zitate sind jedoch normalerweise zur Klarheit enthalten und sind häufig erforderlich, insbesondere für Whitespace (z. B.,,,'s/x x/y y/' '
). Am häufigsten werden einzelne Zitate verwendet, um zu vermeiden, dass die Shell interpretiert wird$
als Shellvariable. Doppelzitate werden verwendet, wie z."S/$ 1/$ 2/g"
, damit die Shell ein Befehlszeilenargument oder eine andere Shell -Variable ersetzen kann.
Verweise
- ^ "Die SED -FAQ, Abschnitt 2.1". Abgerufen 2013-05-21.
- ^ "Die SED -FAQ, Abschnitt 2.2". Abgerufen 2013-05-21.
- ^ a b McIlroy, M. D. (1987). A Research Unix Reader: Annotierte Auszüge aus dem Programmierhandbuch, 1971–1986 (PDF) (Technischer Bericht). Cstr. Bell Labs. 139.
- ^ a b c d "Über die frühe Geschichte und Auswirkungen von Unix".
Eine Weile später entstand eine Nachfrage nach einem weiteren Sonderprogramm, Gres, nach Substitution: g/re/s. Lee McMahon verpflichtete sich, es zu schreiben, und sah bald voraus, dass es kein Ende für die Familie geben würde: G/RE/D, G/RE/A usw. Als sein Konzept sich entwickelte, wurde es SED…
- ^ "Implementierung einer Turing -Maschine als SED -Skript".
- ^ "Turing.sed".
- ^ "The $ sed Home - Gamez".
- ^ "Bolknote/Sedchess". GitHub.
- ^ "Sedtris, ein Tetris -Spiel, das für SED geschrieben wurde".
Weitere Lektüre
- Bell Lab's achte Ausgabe (ca. 1985) Unix SED (1) Handbuch Seite
- Dokumentation oder die manuelle Seite
- Dale Dougherty & Arnold Robbins (März 1997). sed & awk (2. Aufl.). O'Reilly. ISBN 1-56592-225-5.
- Arnold Robbins (Juni 2002). SED und AWK Taschenreferenz (2. Aufl.). O'Reilly. ISBN 0-596-00352-8.
- Peter Patsis (Dezember 1998). Interaktives Arbeitsbuch von UNIX AWK und SED Programmer (Unix Interactive Workbook). Prentice Hall. ISBN 0-13-082675-8.
- Daniel Goldman (Februar 2013). Endgültige Anleitung zu SED. EHDP Press. ISBN 978-1-939824-00-4.
- SourceForge.net, die SED -FAQ (März 2003)
Externe Links
- Die einzelne Unix -Spezifikation, Version 4 von Die offene Gruppe - Shell and Utilities Referenz,
- Plan 9 Programmierhandbuch, Volume 1 - -
Tutorials
- SED - Eine Einführung und ein Tutorial, von Bruce Barnett
- SED-Ein nicht-interaktiver Texteditor (1974), von Lee E. McMahon
- 31+ Beispiele für SED Linux -Befehl in Textmanipulation, von Mokhtar Ebrahim
Beispiele
- Hauptquellen für SED -Skripte, Dateien, Verwendung
- Roger Changs SED- und Shell -Skripte (2012)
- Top 'SED' -Befehle - Verwendungsbeispiele Archiviert 2018-11-10 bei der Wayback -Maschine
- SED -Befehlsbeispiele in Unix & Linux
Andere Links
- Gnu sed Homepage (Beinhaltet Gnu sed Manual)
- SED Der Stream Editor (2004) (Eric Pement)
- Sed-User Yahoo Diskussionsgruppe
- abgestörte SED -Implementierung Originalautor Eric_S._Raymond, gepflegt durch exactCode.