www.wikidata.de-de.nina.az
sed steht fur Stream EDitor und ist ein Unix Werkzeug mit dem Text Datenstrome bearbeitet werden konnen Der Datenstrom kann auch aus einer Datei gelesen werden Im Gegensatz zu einem Texteditor wird die Ursprungsdatei aber nicht verandert Im Gegensatz zu einem interaktiven Texteditor wie etwa dem vi wird sed mittels eines Skripts gesteuert Der sed Befehlssatz orientiert sich an jenem des zeilenorientierten Texteditors ed Dabei werden fur die Text Durchmusterung laut der POSIX Spezifikation eine bestimmte Abart der Regular Expressions sogenannte POSIX Basic Regular Expressions BRE verwendet 1 Die GNU Implementation verwendet allerdings GNU BREs die von POSIX BREs geringfugig abweichen Auch wenn der Sprachumfang von sed ziemlich limitiert und spezialisiert erscheint so handelt es sich doch um eine Turing vollstandige Sprache Beweisen kann man die Turing Vollstandigkeit indem man eine Turingmaschine mittels sed programmiert 2 3 oder indem man mit sed einen Interpreter fur eine andere Turing vollstandige Sprache schreibt 4 Folglich konnten und wurden sogar Spiele wie Sokoban oder Arkanoid und andere anspruchsvolle Programme wie Debugger mit sed geschrieben 5 Inhaltsverzeichnis 1 Arbeitsweise 2 Programmierung 2 1 Textmanipulationen 2 1 1 Zusammengesetzte Kommandos 2 2 Verzweigungen 2 3 Sonstige Anweisungen 2 3 1 Hold Space Manipulation 2 3 2 Mehrzeilen Anweisungen 3 Anwendungen Optionen Hinweise 3 1 Kapazitatsgrenzen 3 2 Greedyness 3 3 Praktische Grenzen in der Shell Programmierung 3 4 In Place Editing 3 5 RegExp Notation 3 6 Einige typische Verfahren 3 6 1 Loschung von Textteilen 3 6 2 Ansprechen von mindestens einem Zeichen 3 6 3 Ersetzung mehrerer bzw aller Vorkommen innerhalb einer Zeile 3 6 4 Filtern bestimmter Zeilen 3 6 5 Debugging 4 Weblinks 5 EinzelnachweiseArbeitsweise Bearbeitensed kann sowohl innerhalb einer Pipeline als auch auf Dateien arbeiten Ausgaben erfolgen grundsatzlich auf lt stdout gt Fehlermeldungen auf lt stderr gt Der typische Aufruf sieht deshalb so aus sed Anweisung1 Anweisung2 AnweisungN Eingabedatei gt Ausgabedatei lt stream gt sed Anweisung1 Anweisung2 AnweisungN lt stream gt sed liest eine Eingabedatei oder einen input stream auf lt stdin gt zeilenweise ein Diese Eingangsdaten landen zunachst im sogenannten Pattern Space Auf diesem Pattern Space wird nacheinander jede Anweisung des vorgegebenen Programmes ausgefuhrt Jede dieser Anweisungen kann dabei den Pattern Space verandern folgende Anweisungen werden dann auf dem jeweiligen Ergebnis der letzten Anweisung ausgefuhrt Fuhrt eine dieser Veranderungen zu einem Nulltext so wird die Verarbeitung an dieser Stelle abgebrochen und die Anweisungsliste mit der nachsten Eingabezeile wieder von vorne begonnen Ansonsten wird das Ergebnis der letzten Anweisung auf lt stdout gt ausgegeben und die Anweisungsliste ebenfalls mit der nachsten Eingabezeile wieder begonnen Programmierung Bearbeitensed Anweisungen konnen grob in drei Gruppen unterteilt werden Textmanipulationen Verzweigungen und sonstige Die meisten sed Handbucher wie auch die POSIX Spezifikation unterteilen abweichend davon Anweisungen in 2 Adress 1 Adress und adresslose siehe unten aber diese Gruppierung ist fur Einfuhrungszwecke nicht geeignet Textmanipulationen Bearbeiten Dies ist die am weitaus haufigsten eingesetzte Funktion und der Befehlssatz ist hier auch besonders reichhaltig Generell hat eine Anweisung folgende Struktur 2 Adress Kommando lt Adresse1 gt lt Adresse2 gt Kommando Optionen Adresse1 und Adresse2 konnen auch weggelassen werden Werden beide Adressen angegeben so wird Kommando fur jede Zeile beginnend mit jener die mit Adresse1 ubereinstimmt bis zu der die mit Adresse2 ubereinstimmt ausgefuhrt Werden Adresse1 und Adresse2 nicht angegeben so wird Kommando fur jede Zeile ausgefuhrt wird lediglich Adresse2 weggelassen so wird Kommando nur fur Zeilen ausgefuhrt die mit Adresse1 ubereinstimmen Eine Adresse ist entweder eine Zeilennummer oder ein regularer Ausdruck Regulare Ausdrucke werden dabei in zwei eingeschlossen Zwei Beispiele sed Beginn Ende s alt NEU inputfileInput Outputx alt Beginn y alt Ende z alt x alt Beginn y NEU Ende z alt alt wird durch NEU ersetzt aber nur ab der Zeile die Beginn enthalt bis zu der Zeile die Ende enthalt 2 Adress Variante Hingegen wird dieselbe Ersetzung im zweiten Beispiel in allen Zeilen durchgefuhrt die mit y oder z beginnen 1 Adress Variante sed yz s alt NEU inputfileInput Outputx alt Beginn y alt Ende z alt x alt Beginn y NEU Ende z NEUZusammengesetzte Kommandos Bearbeiten Anstatt eines einzelnen Kommandos kann Kommando auch eine Liste von Anweisungen enthalten die durch umschlossen werden Fur diese Anweisungen gelten wieder die oben beschriebenen Regeln sie konnen ihrerseits ebenfalls aus weiteren zusammengesetzten Kommandos bestehen Ein Beispiel sed yz s yz 1 s alt NEU inputfileInput Outputx alt Beginn y alt Ende z alt x alt Beginn y NEU Ende z NEUVerzweigungen Bearbeiten sed kennt zwei Arten von Verzweigungen unbedingte Verzweigungen Sprunganweisungen und bedingte die in Abhangigkeit einer zuvor erfolgten oder nicht erfolgten Ersetzungsoperation zur Ausfuhrung kommen Ein typisches Anwendungsbeispiel ist das folgende ein Quelltext wurde mit Hilfe von fuhrenden Tabulatorzeichen eingeruckt diese fuhrenden Tabs sollen durch jeweils 8 Blanks ersetzt werden Andere als am Zeilenbeginn liegende Tabs konnen im Text vorkommen sollen aber nicht verandert werden Das Problem besteht darin dass multiplikative Verknupfungen ersetze N Tabs durch N 8 Blanks nicht als RegExp ausgedruckt werden konnen Andererseits wurde eine globale Ersetzung auch die Tabulatorzeichen innerhalb des Texts betreffen Deshalb wird mit Sprunganweisungen eine Schleife gebildet im Folgenden werden Blanks und Tabs zur besseren Verstandlichkeit durch lt b gt und lt t gt symbolisiert sed start lt b gt lt t gt s lt b gt lt t gt 1 lt b gt lt b gt lt b gt lt b gt lt b gt lt b gt lt b gt lt b gt b start inputfileIn jeder Zeile wird das erste Tabulatorzeichen sofern davor lediglich null oder mehr Leerzeichen stehen durch 8 Leerzeichen ersetzt danach sorgt die Sprunganweisung b lt Sprungzielname gt dafur dass die Programmausfuhrung wieder zur ersten Zeile zuruckkehrt Ist das letzte fuhrende Tabulatorzeichen ersetzt so matcht der Ausdruck lt b gt lt t gt nicht mehr und der Block wird nicht ausgefuhrt sodass das Programmende erreicht und die nachste Zeile eingelesen wird Hier wird die Ahnlichkeit mit Assembler Sprachen deutlich indem mit einer Bedingung und einem Label eine Kontrollstruktur vergleichbar dem in Hochsprachen ublichen repeat until aufgebaut wird Sonstige Anweisungen Bearbeiten Hold Space Manipulation Bearbeiten Eine machtige gleichwohl relativ unbekannte Funktion von sed ist der sogenannte Hold Space Das ist ein frei verfugbarer Speicherbereich der in seiner Arbeitsweise dem in manchen Assembler Sprachen bekannten Akkumulator ahnelt Direkte Manipulation der Daten im Hold Space ist zwar nicht moglich aber Daten im Pattern Space konnen in den Hold Space verlagert kopiert oder auch mit dem Inhalt desselben vertauscht werden Auch das Anhangen des Pattern Spaces an den Hold Space oder vice versa ist moglich Das folgende Beispiel verdeutlicht die Funktion des Hold Space der Text einer Kapiteluberschrift wird gespeichert und jeder Zeile des jeweiligen Kapitels nachgestellt die Zeile mit der Kapiteluberschrift selbst aber unterdruckt sed s s s h d G s n inputfileInput Output Kapitel1 Zeile 1 Zeile 2 Zeile 3 Kapitel2 Zeile A Zeile B Zeile C Zeile 1 Kapitel1 Zeile 2 Kapitel1 Zeile 3 Kapitel1 Zeile A Kapitel2 Zeile B Kapitel2 Zeile C Kapitel2 Immer wenn eine Zeile mit beginnt so wird der Anweisungsblock ausgefuhrt der dieses Zeichen entfernt und dafur die restliche Zeile mit einem fuhrenden Leerzeichen und Klammern versieht Danach wird dieser Text in den Hold Space kopiert h und aus dem Pattern Space geloscht d wodurch das Programm fur diese Zeile beendet und die nachste Zeile gelesen wird Da fur normale Zeilen die Bedingung des Eingangsblocks nicht zutrifft wird lediglich die letzte Anweisung G durchgefuhrt die den Inhalt des Hold Space an den Pattern Space anhangt Mehrzeilen Anweisungen Bearbeiten Nicht alle Textmanipulationen lassen sich innerhalb einzelner Zeilen ausfuhren Manchmal mussen Informationen aus anderen Zeilen in die Entscheidungsfindung miteinbezogen werden manchmal auch zeilenubergreifende Ersetzungen durchgefuhrt werden Dafur sieht die sed Programmiersprache die Anweisungen N P und D vor mit denen mehrere Zeilen des Eingabetexts gleichzeitig in den Pattern Space geladen N und Teile davon ausgegeben P oder geloscht D werden konnen Ein typisches Anwendungsbeispiel ist der folgende Einzeiler eigentlich zwei Einzeiler der einen Text mit Zeilennummern versieht sed inputfile sed N s n lt t gt Der erste sed Aufruf druckt fur jede Zeile im Eingangstext die Zeilennummer aus und danach die Zeile selbst Der zweite sed Aufruf verbindet diese beiden Zeilen zu einer einzigen indem erst die jeweils nachfolgende Zeile eingelesen N und dann das automatisch eingefugte Zeilentrennzeichen n durch ein Tabulatorzeichen ersetzt wird Anwendungen Optionen Hinweise BearbeitenKapazitatsgrenzen Bearbeiten sed unterliegt keinen realen Beschrankungen hinsichtlich der Dateigrossen Abgesehen vom verfugbaren Plattenplatz der eine praktische Grenze darstellt realisieren die meisten Implementationen den Zeilenzahler als int oder long int Bei den heute ublichen 64 Bit Prozessoren kann die Gefahr eines Uberlaufs deshalb vernachlassigt werden Wie die meisten textmanipulierenden Tools in UNIX unterliegt sed allerdings einer Begrenzung hinsichtlich der Zeilenlange genauer der Anzahl Bytes bis zum nachfolgenden newline Zeichen Die Mindestgrosse ist durch den POSIX Standard festgelegt die tatsachliche Grosse kann von System zu System variieren und kann im jeweiligen Fall in der Kernel Headerdatei usr include limits h als Wert der Konstanten LINE MAX nachgeschlagen werden Die Lange wird in Bytes angegeben nicht in Zeichen weshalb eine Umrechnung etwa bei der Verarbeitung von UTF codierten Dateien die einzelne Zeichen mit mehreren Bytes darstellen notig ist Greedyness Bearbeiten Siehe auch Regularer Ausdruck Beim Geltungsbereich von RegExps wird zwischen greedy und non greedy unterschieden sed RegExps sind immer greedy das bedeutet dass die RegExp immer den langstmoglichen Geltungsbereich hat a B a gefolgt von null oder mehr beliebigen Zeichen gefolgt von B axyBBBskdjfhaaBBpweruBjdfh langstmoglicher Geltungsbereich greedy axyBBBskdjfhaaBBpweruBjdfh kurzestmoglicher Geltungsbereich non greedy Der Grund ist dass sed auf Geschwindigkeit optimiert ist und non greedy RegExps aufwendiges Backtracking erfordern wurde Will man ein Non greedy Verhalten erzwingen so erreicht man dies ublicherweise durch negierte Zeichenklassen Im obigen Beispiel etwa a B B a gefolgt von null oder mehr nicht B gefolgt von B Praktische Grenzen in der Shell Programmierung Bearbeiten Es sollte nicht unerwahnt bleiben dass die allerhaufigste Anwendung von sed aber auch von a href Awk html title Awk awk a a href Tr Unix html title Tr Unix tr a und ahnlichen Filterprogrammen in der Praxis die Manipulation ad hoc von Ausgaben anderer Kommandos etwa so ls l path to myfile sed s 1 gibt Filetype und Filemode ausgenaugenommen einen Missbrauch darstellt Da jeder Aufruf eines externen Programmes die aufwendigen Systemaufrufe a href Fork Unix Nutzung von Fork zum Starten anderer Programme html title Fork Unix fork a und exec erfordert sind Shell interne Methoden etwa die sogenannte Variablenexpansion selbst wenn sie deutlich langer zu schreiben sind meist dem Aufruf von externen Programmen uberlegen 6 Die Faustregel dafur lautet wenn die Ausgabe des Filterprozesses eine Datei bzw ein Datenstrom ist so ist das Filterprogramm zu verwenden ansonsten ist Variablenexpansion vorzuziehen In Place Editing Bearbeiten Aufgrund der Art wie sed Textmanipulationen durchfuhrt kann dies nicht direkt auf der Eingabedatei geschehen Als Ausgabe wird eine von dieser getrennte Datei benotigt die gegebenenfalls danach uber die Eingangsdatei kopiert wird sed lt Anweisungen gt path to inputfile gt path to output mv path to output path to inputDies ist auch so im POSIX Standard vorgesehen Die GNU Version von sed bietet zusatzlich zum POSIX Standard die Kommandozeilen Option i Diese erlaubt es eine Datei scheinbar ohne Umweg in place zu verandern tatsachlich wird aber im Hintergrund ebenfalls eine temporare Datei angelegt Diese wird im Fehlerfall nicht geloscht und die Metadaten Besitzer Gruppe Inode Nummer der Originaldatei auf jeden Fall verandert RegExp Notation Bearbeiten Es hat sich eingeburgert regular Expressions wie auch in den obigen Beispielen durch Schragstriche zu begrenzen sed erfordert dies allerdings nicht Jedes Zeichen das einem Ersetzungskommando folgt wird als Begrenzer akzeptiert und dann in der Folge erwartet Diese beiden Anweisungen sind deshalb gleichwertig s 2 1 vertauscht erstes und zweites Wort einer Zeile s 2 1 statt Dies ist praktisch wenn der Schragstrich als Teil der RegExp benotigt wird weil man sich dann das muhsame Escapen Kenntlichmachen der Verwendung als Literal ersparen kann Man weicht dann einfach auf ein anderes nicht verwendetes Zeichen aus Einige typische Verfahren Bearbeiten Loschung von Textteilen Bearbeiten Erfolgt durch Ersetzung durch nichts Explizite Loschung fur Teile einer Zeile ist nur vom Zeilenbeginn bis zum ersten Zeilentrennzeichen D vorgesehen Der Ausdruck Ausdruck dloscht hingegen NICHT den Teil Ausdruck sondern jede Zeile die Ausdruck enthalt Ausdruck fungiert hier als die Adresse siehe oben 1 Adress Variante des Kommandos d Ansprechen von mindestens einem Zeichen Bearbeiten Im Umfang der POSIX BREs ist im Unterschied zu den GNU BREs der Quantor fur ein oder mehrere des vorangegangenen Ausdrucks nicht vorgesehen Um portable sed Scripte zu schreiben die nicht nur mit GNU sed laufen sollte der Quantor min verwendet werden xa y GNU Variante fur x gefolgt von einem oder mehr aber nicht null a gefolgt von y xa 1 y dasselbe in POSIX x gefolgt von mindestens einem a gefolgt von y Ersetzung mehrerer bzw aller Vorkommen innerhalb einer Zeile Bearbeiten Ohne Angabe weiterer Optionen wird immer nur das erste Vorkommen eines Suchtexts der Ersetzungsregel unterworfen sed s alt NEU inputfileInput Outputalt alt alt alt alt alt alt alt alt alt alt alt alt alt alt NEU NEU alt NEU alt alt NEU alt alt alt NEU alt alt alt altDieses Verhalten kann allerdings durch die Angabe von Kommandoptionen geandert werden Wird eine Zahl N angegeben dann wird lediglich das N te Vorkommen geandert ein g fur global andert alle Vorkommen sed s alt NEU g inputfileInput Outputalt alt alt alt alt alt alt alt alt alt alt alt alt alt alt NEU NEU NEU NEU NEU NEU NEU NEU NEU NEU NEU NEU NEU NEU NEUFiltern bestimmter Zeilen Bearbeiten Grundsatzlich gibt sed immer den Inhalt des Pattern Spaces nach der letzten Anweisung aus Will man dieses Verhalten fur einzelne Zeilen unterdrucken so kann man entweder uber eine Regel bestimmte Zeilen loschen explizite Filterung aber es ist auch mit der Kommandozeilen Option n moglich dieses Verhalten insgesamt abzustellen implizite Filterung Ausgegeben wird dann nur noch was mit dem ausdrucklichen Print Kommando p angegeben wird p kann dabei entweder als eigene Anweisung oder als Option fur andere Anweisungen dienen Das Beispiel gibt aus dem bereits oben verwendeten Text nur noch die Kapiteluberschriften aus sed n s Kapiteluberschrift 1 p inputfileInput Output Kapitel1 Zeile 1 Zeile 2 Zeile 3 Kapitel2 Zeile A Zeile B Zeile C Kapiteluberschrift Kapitel1 Kapiteluberschrift Kapitel2Debugging Bearbeiten Zur Fehlersuche kann es nutzlich sein sich Zwischenergebnisse ausgeben zu lassen um die Entwicklung im Pattern Space besser nachvollziehen zu konnen Dazu kann die bereits oben erwahnte Option p verwendet werden Zeilen konnen durchaus mehrmals hintereinander ausgegeben werden In dem obigen Beispielprogramm etwa sed s p s p s p h d p G inputfileWeblinks Bearbeiten a href http www opengroup org onlinepubs 9699919799 utilities sed html sed 1 a stream editor Open Group Base Specification b sed 1 b stream editor OpenBSD General Commands Manual b sed 1 b Stromeditor zum Filtern und Umwandeln von Text Debian GNU Linux Ausfuhrbare Programme oder Shell Befehle Handbuchseite sed Projektseite auf sourceforge englisch seder s grab bag englisch sed fur Windows mit funktionierender i Option ZIP 50 kB Ausfuhrliches Tutorium deutsch Einzelnachweise Bearbeiten sed Spezifikation der Open Group Abgerufen am 27 Marz 2013 englisch Implementation of a Turing Machine as Sed Script Abgerufen am 23 Marz 2013 englisch Turing Maschine mit sed Abgerufen am 17 Marz 2013 cam ac uk Memento vom 18 April 2010 im Internet Archive Liste verschiedener sed Skripte Abgerufen am 19 November 2011 englisch Comparing the Run Time Efficiency of a ROT13 Algorithm in tr vs ksh93 Abgerufen am 25 Marz 2013 englisch Unix Befehle der GNU Core UtilitiesDateien chgrp chown chmod cp dd df dir dircolors install ln ls mkdir mkfifo mknod mv rm rmdir shred sync touch vdirText awk cat cksum comm csplit cut expand fmt fold head join md5sum nl od paste ptx pr sha1sum sed sort split sum tac tail tr tsort unexpand uniq wcShell basename chroot date dirname du echo env expr factor false groups hostid id link logname nice nohup pathchk pinky printenv printf pwd readlink seq sleep stat stty tee test true tty uname unlink users who whoami yesNormdaten Sachbegriff GND 4262086 7 lobid OGND AKS Abgerufen von https de wikipedia org w index php title Sed Unix amp oldid 236379085