|
|
(176 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) |
Zeile 1: |
Zeile 1: |
| = {{anchor|RefHeading339881143486078}} Linux- Stream Editor – sed =
| | {{DISPLAYTITLE:sed}} |
| | '''sed''' - Stromeditor zum Filtern und Umwandeln von Text |
|
| |
|
| == {{anchor|RefHeadingToc33675998840441}} Einführung == | | == Beschreibung == |
|
| |
|
| * sed is a “non-interactive” stream-oriented editor. Since its an “non-interactive” it can be used to automate editing if desired.
| | '''sed''' steht für ''Stream EDitor'' und ist ein [[Unix]]-Werkzeug, mit dem Text-[[Datenstrom|Datenströme]] bearbeitet werden können. Der Datenstrom kann auch aus einer Datei gelesen werden. Im Gegensatz zu einem [[Texteditor]] wird die Ursprungsdatei aber nicht verändert. |
| * The name sed is an abbreviation for stream editor, and the utility derives many of its commands from the ed line-editor (ed was the first UNIX text editor).
| |
| * This allows you to edit multiple files, or to perform common editing operations without ever having to open vi or emacs.
| |
| * sed reads from a file or from its standard input, and outputs to its standard output.
| |
| * sed has two buffers which are called pattern buffer and hold buffer. Both are initially empty.
| |
|
| |
|
| | Im Gegensatz zu einem interaktiven Texteditor, wie etwa dem [[vi]], wird <code>sed</code> mittels eines [[Skriptsprache|Skripts]] gesteuert. |
|
| |
|
| | Der <code>sed</code>-Befehlssatz orientiert sich an jenem des [[Zeilenorientierter Editor|zeilenorientierten Texteditors]] [[Ed (Texteditor)|ed]]. Dabei werden für die Text-Durchmusterung laut der [[Portable Operating System Interface|POSIX]]-Spezifikation eine bestimmte Abart der [[Regulärer Ausdruck|Regular Expressions]], sogenannte (POSIX-) ''Basic Regular Expressions'' (BRE) verwendet.<ref>{{Internetquelle |url=http://pubs.opengroup.org/onlinepubs/009695399/utilities/sed.html#tag_04_126_13_02 |titel=sed-Spezifikation der Open Group |sprache=en |zugriff=2013-03-27}}</ref> Die [[GNU]]-Implementation verwendet allerdings ''GNU-BRE''s, die von ''POSIX-BRE''s geringfügig abweichen. |
|
| |
|
| === {{anchor|RefHeadingToc35291725578261}} Arbeitsweise<div style="margin-left:0cm;margin-right:0cm;">aus regex-skript</div> === | | Auch wenn der Sprachumfang von <code>sed</code> ziemlich limitiert und spezialisiert erscheint, so handelt es sich doch um eine [[Turing-Vollständigkeit|Turing-vollständige]] Sprache. Beweisen kann man die Turing-Vollständigkeit, indem man eine [[Turingmaschine]] mittels <code>sed</code> programmiert<ref>{{Internetquelle |url=http://www.catonmat.net/ftp/sed/turing.txt |titel=Implementation of a Turing Machine as Sed Script |sprache=en |zugriff=2013-03-23}}</ref><ref>{{Internetquelle |url=http://www.stunet.tu-freiberg.de/~bahmann/turing-sed/ |titel=Turing-Maschine mit ''sed'' |sprache=de |zugriff=2013-03-17}}</ref> oder indem man mit ''sed'' einen Interpreter für eine andere, Turing-vollständige Sprache schreibt.<ref>{{Webarchiv|url=http://mi.eng.cam.ac.uk/~er258/code/sed/ |wayback=20100418131328 |text=cam.ac.uk}}</ref> |
|
| |
|
| [[Image:Grafik1.png|right|top]]Print the pattern buffer to stdout. Der Stream Editor ist kein herkömmlicher Editor wie Vi oder Emacs. Sed arbeitet nicht interaktiv; er wird mittels Kommandozeilenoptionen oder durch ein Skript gesteuert. | | Folglich konnten und wurden sogar Spiele wie [[Sokoban]] oder [[Arkanoid]] und andere anspruchsvolle Programme wie [[Debugger]] mit sed geschrieben.<ref>{{Internetquelle |url=http://sed.sourceforge.net/grabbag/scripts/#misc |titel=Liste verschiedener sed-Skripte |sprache=en |zugriff=2011-11-19}}</ref> |
|
| |
|
| Sed modifiziert nicht das Original, sondern schreibt das Ergebnis auf die Standard-Ausgabe.
| |
|
| |
|
| Die aktuell betrachtete Zeile lädt der Sed in einen temporären Puffer - nachfolgend als Arbeitspuffer bezeichnet.
| | ; Sed ist ein Stromeditor (stream editor) |
| | * Ein Stromeditor wird für grundlegende Texttransformationen auf einen Eingabestrom (einer Datei oder aus einer Verarbeitungskette) verwandt. |
| | * Obwohl in einigen Aspekten ähnlich zu einem Editor, der Bearbeitungen nach Skript erlaubt (wie Ed), führt Sed nur einen Durchlauf über die Eingabe(n) durch und ist somit effizienter. |
| | * Allerdings ist es die Fähigkeit von Sed, Text in einer Verarbeitungskette zu filtern, die ihn besonders gegenüber anderen Arten von Editoren auszeichnet. |
|
| |
|
| ==== {{anchor|RefHeadingToc32081725578261}} Unix Sed Working methodology ====
| | * Da es ein "nicht-interaktives" Programm ist, kann es, falls gewünscht, zur Automatisierung der Bearbeitung verwendet werden. |
| | * Der Name sed ist eine Abkürzung für stream editor, und das Dienstprogramm leitet viele seiner Befehle vom ed line-editor ab (ed war der erste UNIX-Texteditor). |
| | * So können Sie mehrere Dateien bearbeiten oder gängige Bearbeitungsvorgänge durchführen, ohne jemals vi oder emacs öffnen zu müssen. |
| | * sed liest aus einer Datei oder von der Standardeingabe und gibt auf der Standardausgabe aus. |
| | * sed hat zwei Puffer, die Musterpuffer und Haltepuffer genannt werden. |
| | * Beide sind anfangs leer. |
|
| |
|
| This is called as one execution cycle. Cycle continues till end of file/input is reached.# Read a entire line from stdin/file.
| | ; Funktionsweise |
| # Removes any trailing newline.
| | * Geben Sie den Musterpuffer auf stdout aus. |
| # Places the line, in its pattern buffer.
| | * Der Stream-Editor ist kein herkömmlicher Editor wie Vi oder Emacs. |
| # Modify the pattern buffer according to the supplied commands.
| | * Sed arbeitet nicht interaktiv, sondern wird über Kommandozeilenoptionen oder ein Skript gesteuert. |
| | * Sed verändert nicht das Original, sondern schreibt das Ergebnis auf die Standardausgabe. |
| | * Sed lädt die aktuell betrachtete Zeile in einen temporären Puffer - im Folgenden als Arbeitspuffer bezeichnet. |
|
| |
|
| | ==== Unix Sed Arbeitsmethodik ==== |
| | ; Ausführungszyklus |
| | * Der Zyklus wird fortgesetzt, bis das Ende der Datei/Eingabe erreicht ist # Lesen einer ganzen Zeile aus stdin/file |
| | # Entfernt alle nachstehenden Zeilenumbrüche |
| | # Legt die Zeile in seinen Musterpuffer |
| | # Ändert den Musterpuffer entsprechend den übergebenen Befehlen |
|
| |
|
| | ==== Reguläre Ausdrücke ==== |
| | ; POSIX.2-BREs sollten unterstützt werden |
| | * Dies erfolgt allerdings aus Leistungsgründen nicht vollständig. |
| | * Die Sequenz \n in einem regulären Ausdruck passt auf das Zeilenumbruchzeichen und ähnliches gilt für \a, \t und andere Sequenzen. |
| | * Die Option -E schaltet auf die Verwendung von erweiterten regulären Ausdrücken um; sie wurde seit Jahren in GNU Sed unterstützt und ist jetzt in POSIX enthalten. |
|
| |
|
| ==== Aufruf ==== | | == Installation == |
| | # '''apt install sed''' |
|
| |
|
| Der Aufruf des Stream Editors auf der Kommandozeile besitzt immer folgendes Format:
| | == Aufruf == |
| | $ '''sed''' [-V] [--version] [--help] [-n] [--quiet] [--silent] |
| | [-l N] [--line-length=N] [-u] [--unbuffered] |
| | [-E] [-r] [--regexp-extended] |
| | [-e Skript] [--expression=script] |
| | [-f Skriptdatei] [--file=Skriptdatei] |
| | [script-if-no-other-script] |
| | [Datei …] |
|
| |
|
| sed 'Kommando' Dateiname
| | === Optionen === |
| | | {| class="wikitable sortable options" |
| Wenn man sed eine Variable übergeben möchte, eignet sich die Verwendung von doppelten Anführungszeichen. Das ist vor allem in Skripten oft der Fall.
| |
| | |
| sed "Kommando mit $Variable" Dateiname
| |
| | |
| Das hängt damit zusammen, dass die Bash den Inhalt von einfachen Anführungszeichen als reinen Text versteht. Inhalt der doppelten Anführungszeichen jedoch wird auf Sonderbedeutung überprüft.
| |
| | |
| Die doppelten Anführungszeichen haben aber auch zu Folge, dass man das $-Zeichen bei der Adressierung nicht einfach so verwenden kann.
| |
| | |
| Um die Sonderbedeutung es $-Zeichen in doppelten Anführungszeichen aufzuheben, muss ein Backslash vorangestellt werden (\$).
| |
| | |
| sed arbeitet zeilenorientiert, d.h. es liest die Eingabedatei Zeile pro Zeile und wendet auf jede Zeile den bzw. die Befehle an. Eine Zeile endet dort, wo das Zeichen "linefeed", also 0x0A steht.
| |
| | |
| === {{anchor|RefHeading39701624094027}} Dateiübergabe an sed ===
| |
| | |
| ==== Output von cat als Input von sed ====
| |
| | |
| cat sed-test-txt | sed [anweisungen...]
| |
| | |
| ==== Umleitung von Stdin ====
| |
| | |
| sed [anweisungen...] < sed-test.txt
| |
| | |
| ==== Dateiname als Kommandozeilenparamter ====
| |
| | |
| sed [anweisungen...] sed-test.txt
| |
| | |
| === {{anchor|RefHeading39721624094027}} Ausgabe ===
| |
| | |
| Die Ausgabe erfolgt nach Stdout, also auf den Bildschirm. Sie kann mittels Pipe-Symbol an andere Kommandos übergeben oder in eine Datei umgeleitet werden:
| |
| | |
| ==== Stdout ist Stdin für "less" ====
| |
| | |
| cat sed-test-txt | sed [anweisungen...] | less
| |
| | |
| ==== Umleitung in Datei ==== | |
| | |
| cat sed-test-txt | sed [anweisungen...] > output.txt
| |
| | |
| === {{anchor|RefHeading3008101082722535}} Kommandoübersicht ===
| |
| | |
| Die Aktionen von Sed werden durch Kommandos gesteuert. Diese Kommandos können Zeilenangaben oder -bereiche enthalten, dann betrachtet der Editor nur die Zeilen der zu bearbeitenden Datei.
| |
| | |
| Fehlt eine solche Angabe, bearbeitet Sed die gesamte Datei.
| |
| | |
| Bevor wir das Verhalten anhand von Beispielen kennen lernen, seien alle Kommandos aufgeführt:
| |
| | |
| | |
| {| style="border-spacing:0;margin:auto;width:17.501cm;" | |
| |-
| |
| | align=center style="border-top:0.05pt solid #000000;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | <tt>'''a '''</tt>
| |
| | style="border:0.05pt solid #000000;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | Fügt eine oder mehrere Zeilen an die aktuelle Zeile an
| |
| |-
| |
| | align=center style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | <tt>'''c '''</tt>
| |
| | style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | Ersetzt Text in der aktuellen Zeile
| |
| |-
| |
| | align=center style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | <tt>'''d '''</tt>
| |
| | style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | Löscht Zeile(n)
| |
| |- | | |- |
| | align=center style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | <tt>'''g '''</tt>
| | ! Unix !! GNU !! Beschreibung |
| | style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | Kopiert den Inhalt eines temporären Puffers in den Arbeitspuffer (dessen alter Inhalt geht verloren)
| |
| |- | | |- |
| | align=center style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | <tt>'''G '''</tt> | | | -n || --quiet, --silent || unterdrückt die Ausgabe des Musterbereichs |
| | style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | Fügt den Inhalt eines temporären Puffers an den Inhalt des Arbeitspuffers an | |
| |- | | |- |
| | align=center style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | <tt>'''h '''</tt> | | | || --debug || Kommentiert die Programmausführung |
| | style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | Kopiert den Inhalt des Arbeitspuffers in einen temporären Puffer | |
| |- | | |- |
| | align=center style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | <tt>'''H '''</tt> | | | -e Skript || --expression=Skript || Fügt das Skript zu den auszuführenden Befehlen hinzu |
| | style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | Fügt den Inhalt des Arbeitspuffers an einen temporären Puffer an | |
| |- | | |- |
| | align=center style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | <tt>'''i '''</tt> | | | -f Skriptdatei || --file=Skriptdatei || Fügt den Inhalt der Skriptdatei zu den auszuführenden Befehlen hinzu |
| | style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | Fügt Text oberhalb der aktuellen Zeile ein | |
| |- | | |- |
| | align=center style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | <tt>'''l '''</tt> | | | || --follow-symlinks || Symbolischen Links bei der Bearbeitung an Ort und Stelle folgen |
| | style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | Zeigt nicht druckbare Zeichen an | |
| |- | | |- |
| | align=center style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | <tt>'''n '''</tt> | | | -i[ENDUNG] || --in-place[=ENDUNG] || Dateien an Ort und Stelle bearbeiten (erstellt Sicherung, falls ENDUNG angegeben) |
| | style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | Wendet das nächste Kommando anstelle des aktuellen Kommandos auf die nächste Zeile an | |
| |- | | |- |
| | align=center style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | <tt>'''p '''</tt> | | | -l N || --line-length=N || Gibt die gewünschte Zeilenumbruchlänge für den Befehl »l« an |
| | style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | Druckt Zeile(n) | |
| |- | | |- |
| | align=center style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | <tt>'''q '''</tt> | | | || --posix || Deaktiviert alle GNU-Erweiterungen |
| | style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | Beendet den Editor | |
| |- | | |- |
| | align=center style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | <tt>'''r '''</tt> | | | -E, -r || --regexp-extended || Verwendet erweiterte reguläre Ausdrücke in dem Skript (für Portabilität verwenden Sie POSIX -E) |
| | style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | Liest Zeilen aus einer Datei | |
| |- | | |- |
| | align=center style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | <tt>'''! '''</tt> | | | -s || --separate || Betrachtet Dateien getrennt statt als einzigen, kontinuierlichen langen Strom |
| | style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | Wendet das Kommando auf Zeilen an, die nicht zutreffen | |
| | |
| | |
| |- | | |- |
| |} | | | || --sandbox || Arbeitet im »Sandbox«-Modus (deaktiviert e/r/w-Befehle) |
| === {{anchor|RefHeading3008121082722535}} Substitutionen ===
| |
| | |
| Im Zusammenhang mit Substitutionen werden die Kommandos häufig als Flags bezeichnet.
| |
| | |
| Die Wirkung mancher Kommandos (»g«) wird aus dem Kontext entschieden wird.
| |
| | |
| | |
| {| style="border-spacing:0;margin:auto;width:17.501cm;"
| |
| |- | |
| | align=center style="border-top:0.05pt solid #000000;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | <tt>'''g '''</tt> | |
| | style="border:0.05pt solid #000000;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | Globale Ersetzung (jedes Vorkommen des Musters auf der Zeile)
| |
| |- | | |- |
| | align=center style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | <tt>'''p '''</tt> | | | -u || --unbuffered || Lädt minimale Datenmenge aus den Eingabedateien und schreibt die Ausgabepuffer öfter |
| | style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | Ausgabe der Zeile in Verbindung mit "s". | |
| |- | | |- |
| | align=center style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | <tt>'''s '''</tt> | | | -z || --null-data || Zeilen durch NUL-Zeichen trennen |
| | style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | Ersetzen eines Musters durch ein anderes | |
| |- | | |- |
| | align=center style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | <tt>'''w '''</tt> | | | || --help || zeigt Hilfeinformationen an und beendet das Programm |
| | style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | Ausgabe der bearbeiteten Zeilen in eine Datei | |
| |-
| |
| | align=center style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | <tt>'''x '''</tt>
| |
| | style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | Austausch des Inhalts des Zwischenspeichers mit der aktuell bearbeiteten Zeile
| |
| |-
| |
| | align=center style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | <tt>'''y '''</tt>
| |
| | style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | Ersetzen eines Zeichens durch ein anderes
| |
| | |
| | |
| |- | | |- |
| | | || --version || gibt Versionsinformationen aus und beendet das Programm |
| |} | | |} |
| === {{anchor|RefHeading3008141082722535}} Reguläre Ausdrücke ===
| |
|
| |
|
| Folgende Reguläre Ausdrücke werden von sed unterstützt
| | === Befehle === |
| | [[Sed/Befehle]] |
|
| |
|
| | === Rückgabewert === |
|
| |
|
| {| style="border-spacing:0;margin:auto;width:17.501cm;"
| | == Anwendungen == |
| |-
| | === Arbeitsweise === |
| | style="border-top:0.05pt solid #000000;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | <tt>'''^ '''</tt>
| | <code>sed</code> kann sowohl innerhalb einer [[Pipe (Informatik)|Pipeline]] als auch auf [[Datei]]en arbeiten. Ausgaben erfolgen grundsätzlich auf <code><stdout></code>, Fehlermeldungen auf <code><stderr></code>. Der typische Aufruf sieht deshalb so aus: |
| | style="border:0.05pt solid #000000;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | Zeilenanfang
| |
| |-
| |
| | style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | <tt>'''$'''</tt>
| |
| | style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | Zeilenende (bei der Adressierung steht das Zeichen für die letzte Zeile)
| |
| |-
| |
| | style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | <tt>'''. '''</tt>
| |
| | style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | Ein Zeichen (Ausnahme ist der Zeilenumbruch)
| |
| |-
| |
| | style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | <tt>'''<nowiki>* </nowiki>'''</tt>
| |
| | style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | Keine, eine oder mehrere Wiederholungen des vorhergehenden Buchstabens / der vorhergehenden Gruppe
| |
| |-
| |
| | style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | <tt>'''[...] '''</tt>
| |
| | style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | Ein Zeichen aus der Menge
| |
| |-
| |
| | style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | <tt>'''[^...] '''</tt>
| |
| | style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | Kein Zeichen aus der Menge
| |
| |-
| |
| | style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | <tt>'''\(...\) '''</tt>
| |
| | style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | Speichern des enthaltenen Musters | |
| |-
| |
| | style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | <tt>'''& '''</tt>
| |
| | style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | Enthält das Suchmuster
| |
| |-
| |
| | style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | <tt>'''\< '''</tt>
| |
| | style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | Wortanfang
| |
| |-
| |
| | style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | <tt>'''\> '''</tt>
| |
| | style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | Wortende
| |
| |-
| |
| | style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | <tt>'''x\{m\} '''</tt>
| |
| | style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | m-fache Wiederholung des Zeichens x
| |
| |-
| |
| | style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | <tt>'''x\{m,\} '''</tt>
| |
| | style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | Mindestens m-fache Wiederholung des Zeichens x
| |
| |-
| |
| | style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | <tt>'''x\{m,n\} '''</tt>
| |
| | style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | Mindestens m-, maximal n-fache Wiederholung des Zeichens x
| |
| | |
|
| |
|
| |- | | :{| |
| | | |
| | sed 'Anweisung1 |
| | Anweisung2 |
| | … |
| | Anweisung''N''' Eingabedatei > Ausgabedatei |
| | ''<stream>'' | sed 'Anweisung1 |
| | Anweisung2 |
| | … |
| | Anweisung''N''' | ''<stream>'' |
| |} | | |} |
| === {{anchor|RefHeading3008161082722535}} Beispieltexte ===
| |
|
| |
| Die Handhabung des Stream Editors erlernen Sie vermutlich nur durch Beispiele. Zunächst soll es um die Möglichkeiten zur Adressierung von Zeilen mit Sed gehen (das Schema lässt sich u.a. auch im Vi anwenden)
| |
|
| |
|
| '''cat sedtest.txt<div style="margin-left:0cm;margin-right:0cm;"><span style="color:#000000;">Einrückungen?</span></div>
| | <code>sed</code> liest eine Eingabedatei (oder einen <code>input stream</code> auf <code><stdin></code>) zeilenweise ein. Diese Eingangsdaten landen zunächst im sogenannten '''Pattern Space'''. Auf diesem Pattern Space wird nacheinander jede Anweisung des vorgegebenen Programmes ausgeführt. Jede dieser Anweisungen kann dabei den Pattern Space verändern, folgende Anweisungen werden dann auf dem jeweiligen Ergebnis der letzten Anweisung ausgeführt. Führt eine dieser Veränderungen zu einem Nulltext, so wird die Verarbeitung an dieser Stelle abgebrochen und die Anweisungsliste mit der nächsten Eingabezeile wieder von vorne begonnen. Ansonsten wird das Ergebnis der letzten Anweisung auf <code><stdout></code> ausgegeben und die Anweisungsliste ebenfalls mit der nächsten Eingabezeile wieder begonnen. |
| Der Aufruf des Stream Editors besitzt immer das Format:
| |
|
| |
| sed 'Kommando' Dateiname
| |
|
| |
| Dabei kann dem Kommando mitgeteilt werden, welche Zeilen der
| |
| Eingabedatei es bearbeiten soll. Als Adressierung kommen folgende
| |
| Mechanismen in Frage:
| |
|
| |
| Keine Angabe Alle Zeilen
| |
| Nummer Genau diese Zeile
| |
| Start, Ende Alle Zeilen von "Start" bis "Ende"
| |
| $ Symbolisiert die letzte Zeile
| |
| RegEx Zeilen, die den Regulären Ausdruck enthalten
| |
| 1, RegEx Von Zeile 1 bis zur ersten Zeile, die RegEx enthält
| |
|
| |
|
| Um die spätere Arbeit des Editors besser verfolgen zu können, nummerieren wir noch die Datei:
| | === Beispiele === |
| | # [[Sed/Aufruf]] |
| | # [[Sed/Dateiübergabe]] |
| | # [[Sed/Ausgabe]] |
| | # [[Sed/Kommandos]] |
| | # [[Sed/Substitutionen]] |
| | # [[Sed/Regular Expressions]] |
| | # [[Sed/Beispieltext]] |
| | # [[Sed/Anweisungen]] |
| | # [[Sed/Zeilen ausgeben]] |
| | # [[Sed/Adressierung]] |
| | # [[Sed/Zeilen löschen]] |
| | # [[Sed/Suchen und Ersetzen]] |
| | # [[Sed/Mehrere Kommandos]] |
| | # [[Sed/Einfügen]] |
| | # [[Sed/Einfügen aus einer Datei]] |
| | # [[Sed/Schreiben in eine Datei]] |
| | # [[Sed/Dateien direkt bearbeiten]] |
| | # [[Sed/Dateien ergänzen]] |
| | # [[Sed/Nächste Zeile beabeiten]] |
| | # [[Sed/Zeichen tauschen]] |
| | # [[Sed/Sed vorzeitig beenden]] |
| | # [[Sed/Zeilentausch]] |
| | # [[Sed/Sed-Skripte]] |
|
| |
|
| '''nl -w 2 -b a sedtest.txt | tee test.txt'''
| | == Siehe auch == |
| 1 Der Aufruf des Stream Editors besitzt immer das Format:
| | # [[awk]](1) |
| 2
| | # [[ed]](1) |
| 3 sed 'Kommando' Dateiname
| | # [[grep]](1) |
| 4
| | # [[tr]](1) |
| 5 Dabei kann dem Kommando mitgeteilt werden, welche Zeilen der
| | # [[perlre]](1) |
| 6 Eingabedatei es bearbeiten soll. Als Adressierung kommen folgende
| | # sed.info |
| 7 Mechanismen in Frage:
| | # Sed-FAQ http://sed.sf.net/grabbag/tutorials/sedfaq.txt |
| 8
| | # http://sed.sf.net/grabbag/ |
| 9 Keine Angabe Alle Zeilen
| |
| 10 Nummer Genau diese Zeile
| |
| 11 Start, Ende Alle Zeilen von "Start" bis "Ende"
| |
| 12 $ Symbolisiert die letzte Zeile
| |
| 13 RegEx Zeilen, die den Regulären Ausdruck enthalten
| |
| 14 1, RegEx Von Zeile 1 bis zur ersten Zeile, die RegEx enthält
| |
|
| |
|
| ==== Erstellung einer Testdatei ====
| |
|
| |
|
| cat > sed-test.txt << EOF
| | {{Special:PrefixIndex/{{BASEPAGENAME}}}} |
| Dies ist Zeile 1
| |
| Hier isst ein Fehler
| |
| Hier isst noch ein Frhler
| |
| Dies ist die vorletzte Zeile
| |
| Dies ist die letzte Zeile
| |
| EOF
| |
|
| |
|
| ==== Exkurs: Zeilen nummerieren mit nl<div style="margin-left:0cm;margin-right:0cm;">Beispiele einfügen</div> ==== | | === Dokumentation === |
| | # https://www.gnu.org/software/sed/manual/sed.html |
|
| |
|
| <tt>'''nl'''</tt> gibt die Zeilen einer oder mehrerer Dateien (oder der Standardeingabe) mit Zeilennummern auf die Standardausgabe.
| | ==== Man-Page ==== |
| | * {{man|1|sed|posix|stream editor}} |
| | * {{man|1|sed|bsd|stream editor}} |
| | * {{man|1|sed|gnu|Stromeditor zum Filtern und Umwandeln von Text}} |
|
| |
|
| Es können dabei die Zeilen einer (logischen) Seite in einen Kopf, einen Körper und einen Fuß unterteilt werden, die jeweils einzeln und in unterschiedlichen Stilen numeriert werden.
| | ==== Info-Pages ==== |
| | $ info sed |
|
| |
|
| Jeder Teil kann auch leer sein. Wenn vor dem ersten Kopfteil bereits Zeilen vorhanden sind, werden diese Zeilen wie ein Seitenkörper numeriert.
| | === Links === |
| | ==== Projekt ==== |
| | ==== Weblinks ==== |
| | # https://de.wikipedia.org/wiki/Sed_(Unix) |
| | # [http://sed.sourceforge.net/ sed-Projektseite auf sourceforge] (englisch) |
| | # [http://sed.sourceforge.net/grabbag/ seder’s grab bag] (englisch) |
| | # [http://www.pement.org/sed/ sed für Windows mit funktionierender -i Option] ([[ZIP-Dateiformat|ZIP]]; 50 kB) |
| | # [https://tty1.net/sed-tutorium/index.html Ausführliches Tutorium] (deutsch) |
|
| |
|
| Die Numerierung beginnt auf jeder Seite neu. Mehrere Dateien werden als ein einziges Dokument betrachtet und die Zeilennummer wird nicht zurückgesetzt.
| | = Wikipedia = |
| | == Programmierung == |
| | <code>sed</code>-Anweisungen können grob in drei Gruppen unterteilt werden: Textmanipulationen, Verzweigungen und sonstige. (Die meisten <code>sed</code>-Handbücher wie auch die POSIX-Spezifikation unterteilen abweichend davon Anweisungen in 2-Adress-, 1-Adress- und adresslose – siehe [[Sed#Textmanipulationen|unten]] –, aber diese Gruppierung ist für Einführungszwecke nicht geeignet.) |
|
| |
|
| Der Kopfteil wird durch eine Zeile eingeleitet, die nur die Zeichenkette `\:\:\:' enthält.
| | === Textmanipulationen === |
| | Dies ist die am weitaus häufigsten eingesetzte Funktion und der Befehlssatz ist hier auch besonders reichhaltig. Generell hat eine Anweisung folgende Struktur (''2-Adress-Kommando''): |
|
| |
|
| Der Körper wird entsprechend durch `\:\:' und der Fuß durch `\:' eingeleitet. In der Ausgabe werden diese Zeilen als Leerzeilen ausgegeben.
| | {| style="margin-left:2em" |
| | |
| ===== Optionen =====
| |
| | |
| | |
| {| style="border-spacing:0;margin:auto;width:17.501cm;" | |
| |- | | |- |
| | style="background-color:transparent;border-top:0.05pt solid #000000;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.349cm;padding-right:0.349cm;" | <tt>'''-h ''Stil'' '''</tt> | | | |
| | style="border:0.05pt solid #000000;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.349cm;padding-right:0.349cm;" | bestimmt die Art der Zeilennumerierung für die Kopfzeile; das Nummerntrennzeichen wird auch den nicht numerierten Zeilen vorangestellt; als ''Stil'' werden folgende Zeichen erkannt | | <Adresse1>,<Adresse2> Kommando [Optionen] |
| | |} |
|
| |
|
| a alle Zeilen
| | <code>Adresse1</code> und <code>Adresse2</code> können auch weggelassen werden. Werden beide Adressen angegeben, so wird <code>Kommando</code> für jede Zeile, beginnend mit jener, die mit <code>Adresse1</code> übereinstimmt, bis zu der, die mit <code>Adresse2</code> übereinstimmt, ausgeführt. Werden <code>Adresse1</code> und <code>Adresse2</code> nicht angegeben, so wird <code>Kommando</code> für jede Zeile ausgeführt, wird lediglich <code>Adresse2</code> weggelassen, so wird <code>Kommando</code> nur für Zeilen ausgeführt, die mit <code>Adresse1</code> übereinstimmen. Eine Adresse ist entweder eine Zeilennummer oder ein [[regulärer Ausdruck]]. Reguläre Ausdrücke werden dabei in zwei <code>/</code> eingeschlossen. Zwei Beispiele: |
|
| |
|
| t leere Zeilen nicht (Voreinstellung für den Körper)
| | {| style="margin-left:2em" |
| | |
| n Zeilen werden nicht numeriert (Voreinstellung für Kopf und Fuß)
| |
| | |
| p '''''Ausdruck''''' nur Zeilen, in denen der reguläre ''Ausdruck'' vorkommt,
| |
| |- | | |- |
| | style="background-color:transparent;border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.349cm;padding-right:0.349cm;" | <tt>'''-b ''Stil'' '''</tt> | | |colspan="2"| |
| | style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.349cm;padding-right:0.349cm;" | bestimmt die Art der Zeilennumerierung für den Körper
| | sed '/Beginn/,/Ende/ s/alt/NEU/' inputfile |
| |- | | |- |
| | style="background-color:transparent;border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.349cm;padding-right:0.349cm;" | <tt>'''-f ''Stil'' '''</tt> | | |'''Input''' |
| | style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.349cm;padding-right:0.349cm;" | bestimmt die Art der Zeilennumerierung für den Fuß
| | |'''Output''' |
| |- | | |- |
| | style="background-color:transparent;border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.349cm;padding-right:0.349cm;" | <tt>'''-p '''</tt> | | | |
| | style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.349cm;padding-right:0.349cm;" | die Zeilen aller Seiten werden fortlaufend numeriert | | x 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“ enthält, bis zu der Zeile, die „Ende“ enthält (2-Adress-Variante). Hingegen wird dieselbe Ersetzung im zweiten Beispiel in allen Zeilen durchgeführt, die mit „y“ oder „z“ beginnen (1-Adress-Variante): |
| | |
| | {| style="margin-left:2em" |
| |- | | |- |
| | style="background-color:transparent;border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.349cm;padding-right:0.349cm;" | <tt>'''-v ''Nummer'' '''</tt> | | |colspan="2"| |
| | style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.349cm;padding-right:0.349cm;" | die erste Zeile jeder logischen Seite bekommt die angegebene Nummer
| | sed '/^[yz]/ s/alt/NEU/' inputfile |
| |- | | |- |
| | style="background-color:transparent;border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.349cm;padding-right:0.349cm;" | <tt>'''-i ''Nummer'' '''</tt> | | |'''Input''' |
| | style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.349cm;padding-right:0.349cm;" | die Schrittweite für die Numerierung
| | |'''Output''' |
| |- | | |- |
| | style="background-color:transparent;border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.349cm;padding-right:0.349cm;" | <tt>'''-l ''Nummer'' '''</tt> | | | |
| | style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.349cm;padding-right:0.349cm;" | die angegebene Anzahl aufeinanderfolgender Leerzeilen werden als eine Zeile angesehen, und die letzte Zeile wird numeriert; | | x alt |
| | Beginn |
| | y alt |
| | Ende |
| | z alt |
| | | |
| | x alt |
| | Beginn |
| | y NEU |
| | Ende |
| | z NEU |
| | |} |
|
| |
|
| wenn weniger Leerzeilen in Folge auftreten, werden sie nicht numeriert;
| | ==== Zusammengesetzte Kommandos ==== |
| | Anstatt eines einzelnen Kommandos kann <code>Kommando</code> auch eine Liste von Anweisungen enthalten, die durch <code>{ … }</code> umschlossen werden. Für diese Anweisungen gelten wieder die oben beschriebenen Regeln, sie können ihrerseits ebenfalls aus weiteren zusammengesetzten Kommandos bestehen. Ein Beispiel: |
|
| |
|
| Leerzeilen dürfen keine Leerzeichen oder Tabulatoren enthalten
| | {| style="margin-left:2em" |
| |- | | |- |
| | style="background-color:transparent;border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.349cm;padding-right:0.349cm;" | <tt>'''-s ''Zeichenkette'' '''</tt> | | |colspan="2"| |
| | style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.349cm;padding-right:0.349cm;" | setzt die ''Zeichenkette'' als Nummerntrennzeichen zwischen Zeilennummer und Text; Voreinstellung ist TAB
| | sed '/^[yz]/ { |
| | s/^\([yz]\)/(\1)/ |
| | s/alt/NEU/ |
| | }' inputfile |
| |- | | |- |
| | style="background-color:transparent;border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.349cm;padding-right:0.349cm;" | <tt>'''-w ''Nummer'' '''</tt> | | |'''Input''' |
| | style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.349cm;padding-right:0.349cm;" | die Zeilennummern erhalten die angegebene Anzahl Stellen; Voreinstellung ist 6
| | |'''Output''' |
| |- | | |- |
| | style="background-color:transparent;border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.349cm;padding-right:0.349cm;" | <tt>'''-n {ln, rn, rz} '''</tt> | | | |
| | style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.349cm;padding-right:0.349cm;" | die Zeilennummern werden in dem angegebenen Stil ausgegeben; dabei bedeutet
| | x alt |
| | | Beginn |
| ln linksbündig, ohne führende Nullen
| | y alt |
| | | Ende |
| rn rechtsbündig, ohne führende Nullen
| | z alt |
| | | | |
| rz rechtsbündig, mit Nullen auf die volle Stellenzahl aufgefüllt
| | x alt |
| |-
| | Beginn |
| | style="background-color:transparent;border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.349cm;padding-right:0.349cm;" | <tt>'''-d ''zwei Zeichen'' '''</tt>
| | (y) NEU |
| | style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.349cm;padding-right:0.349cm;" | die zwei Zeichen werden zur Trennung von Kopf, Körper und Fußteil benutzt, Voreinstellung ist `\:' | | Ende |
| | (z) NEU |
| | |} |
|
| |
|
| | === Verzweigungen === |
| | <code>sed</code> kennt zwei Arten von Verzweigungen: unbedingte Verzweigungen (Sprunganweisungen) und bedingte, die in Abhängigkeit einer zuvor erfolgten oder nicht erfolgten Ersetzungsoperation zur Ausführung kommen. Ein typisches Anwendungsbeispiel ist das folgende: ein Quelltext wurde mit Hilfe von führenden [[Tabulatorzeichen]] eingerückt, diese führenden ''Tabs'' sollen durch jeweils 8 ''Blanks'' ersetzt werden. Andere als am Zeilenbeginn liegende ''Tabs'' können im Text vorkommen, sollen aber nicht verändert werden. Das Problem besteht darin, dass multiplikative Verknüpfungen (''ersetze N Tabs durch N * 8 Blanks'') nicht als RegExp ausgedrückt werden können. Andererseits würde 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 Verständlichkeit durch <code><b></code> und <code><t></code> symbolisiert): |
|
| |
|
| | {| style="margin-left:2em" |
| |- | | |- |
| | |colspan="2"| |
| | sed ':start |
| | /^<b>*<t>/ { |
| | s/^\(<b>*\)<t>/\1<b><b><b><b><b><b><b><b>/ |
| | b start |
| | }' inputfile |
| |} | | |} |
| === {{anchor|RefHeading25579109232536}} Aufbau der sed-Anweisungen ===
| |
|
| |
|
| Aber wenn man ein paar grundlegende Dinge verstanden hat, ist es nicht schwierig. Die sed-Anweisungen werden i.A. von einfachen Hochkommas umschlossen.
| | In jeder Zeile wird das erste Tabulatorzeichen, sofern davor lediglich null oder mehr Leerzeichen stehen, durch 8 Leerzeichen ersetzt, danach sorgt die Sprunganweisung <code>b <Sprungzielname></code> dafür, dass die Programmausführung wieder zur ersten Zeile zurückkehrt. Ist das letzte führende Tabulatorzeichen ersetzt, so matcht der Ausdruck <code>/^<b>*<t>/</code> nicht mehr und der Block wird nicht ausgeführt, sodass das Programmende erreicht und die nächste Zeile eingelesen wird. |
|
| |
|
| sed 'anweisung' < sed-test.txt
| | Hier wird die Ähnlichkeit mit Assembler-Sprachen deutlich, indem mit einer Bedingung und einem [[Label (Programmierung)|Label]] eine Kontrollstruktur vergleichbar dem in Hochsprachen üblichen <code style="white-space:nowrap">repeat-until</code> aufgebaut wird. |
|
| |
|
| | === Sonstige Anweisungen === |
| | ==== Hold Space Manipulation ==== |
| | Eine mächtige (gleichwohl relativ unbekannte) Funktion von <code>sed</code> ist der sogenannte '''Hold Space'''. Das ist ein frei verfügbarer Speicherbereich, der in seiner Arbeitsweise dem in manchen [[Assemblersprache|Assembler-Sprachen]] bekannten [[Akkumulator (Computer)|Akkumulator]] ähnelt. Direkte Manipulation der Daten im Hold Space ist zwar nicht möglich, aber Daten im Pattern Space können in den Hold Space verlagert, kopiert, oder auch mit dem Inhalt desselben vertauscht werden. Auch das Anhängen des Pattern Spaces an den Hold Space oder vice versa ist möglich. |
|
| |
|
| sed kann mehrere Anweisungen in einem Durchgang abarbeiten. In diesem Falle muss jedem Befehl die Option "-e" vorangestellt werden. Wenn nur eine Anweisung abgearbeitet werden soll, kann man "-e" weglassen.
| | Das folgende Beispiel verdeutlicht die Funktion des Hold Space: der Text einer „Kapitelüberschrift“ wird gespeichert und jeder Zeile des jeweiligen „Kapitels“ nachgestellt, die Zeile mit der Kapitelüberschrift selbst aber unterdrückt: |
|
| |
|
| sed -e 'anweisung1' -e 'anweisung2' < sed-test.txt | | {| style="margin-left:2em" |
| | |- |
| | |colspan="2"| |
| | sed '/^=/ { |
| | s/^=// |
| | s/^/ (/ |
| | s/$/)/ |
| | h |
| | d |
| | } |
| | G; s/\n// ' inputfile |
| | |- |
| | |'''Input''' |
| | |'''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 ausgeführt, der dieses Zeichen entfernt und dafür die restliche Zeile mit einem führenden Leerzeichen und Klammern versieht. Danach wird dieser Text in den Hold Space kopiert (<code>h</code>) und aus dem Pattern Space gelöscht (<code>d</code>), wodurch das Programm für diese Zeile beendet und die nächste Zeile gelesen wird. Da für „normale Zeilen“ die Bedingung des Eingangsblocks nicht zutrifft, wird lediglich die letzte Anweisung (<code>G</code>) durchgeführt, die den Inhalt des Hold Space an den Pattern Space anhängt. |
|
| |
|
| möglich, aber etwas unübersichtlicher ist auch diese Form:
| | ==== Mehrzeilen-Anweisungen ==== |
| | Nicht alle Textmanipulationen lassen sich innerhalb einzelner Zeilen ausführen. Manchmal müssen Informationen aus anderen Zeilen in die Entscheidungsfindung miteinbezogen werden, manchmal auch zeilenübergreifende Ersetzungen durchgeführt werden. Dafür sieht die <code>sed</code>-Programmiersprache die Anweisungen <code>N</code>, <code>P</code> und <code>D</code> vor, mit denen mehrere Zeilen des Eingabetexts gleichzeitig in den Pattern Space geladen (<code>N</code>) und Teile davon ausgegeben (<code>P</code>) oder gelöscht (<code>D</code>) werden können. Ein typisches Anwendungsbeispiel ist der folgende Einzeiler (eigentlich zwei Einzeiler), der einen Text mit Zeilennummern versieht: |
|
| |
|
| sed -e 'anweisung1; anweisung2' < sed-test.txt | | {| style="margin-left:2em" |
| | |- |
| | |colspan="2"| |
| | sed '=' inputfile | sed 'N; s/\n/<t>/' |
| | |} |
|
| |
|
| | Der erste <code>sed</code>-Aufruf druckt für jede Zeile im Eingangstext die Zeilennummer aus und danach die Zeile selbst. Der zweite <code>sed</code>-Aufruf verbindet diese beiden Zeilen zu einer einzigen, indem erst die jeweils nachfolgende Zeile eingelesen (<code>N</code>) und dann das automatisch eingefügte Zeilentrennzeichen („\n“) durch ein Tabulatorzeichen ersetzt wird. |
|
| |
|
| In vielen sed-Anweisungen kommt das Zeichen '/' vor. Es ist ein Begrenzungszeichen, also ein "delimiter". Eine Regular Expression, also ein Suchausdruck, wird durch zwei Schrägstriche begrenzt. Im folgende kürze ich "Regular Expression" durch "RE" ab.
| | == Anwendungen, Optionen, Hinweise == |
| | === Kapazitätsgrenzen === |
| | <code>sed</code> unterliegt keinen (realen) Beschränkungen hinsichtlich der Dateigrößen. Abgesehen vom verfügbaren Plattenplatz, der eine praktische Grenze darstellt, realisieren die meisten Implementationen den Zeilenzähler als <code>int</code> oder <code>long int</code>. Bei den heute üblichen 64-Bit-Prozessoren kann die Gefahr eines Überlaufs deshalb vernachlässigt werden. |
|
| |
|
| Unvollständige Anweisung:
| | Wie die meisten textmanipulierenden Tools in UNIX unterliegt <code>sed</code> allerdings einer Begrenzung hinsichtlich der Zeilenlänge (genauer: der Anzahl Bytes bis zum nachfolgenden <code>newline</code>-Zeichen). Die Mindestgröße ist durch den POSIX-Standard festgelegt, die tatsächliche Größe kann von System zu System variieren und kann im jeweiligen Fall in der Kernel-Headerdatei <code>/usr/include/limits.h</code> als Wert der Konstanten <code>LINE_MAX</code> nachgeschlagen werden. Die Länge 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, nötig ist). |
|
| |
|
| sed '/isst/' < sed-test.txt
| | === Greedyness === |
| * sed durchsucht die Datei Zeile pro Zeile nach dem String "isst"
| | {{Siehe auch|Regulärer Ausdruck}} |
| * die RE "isst" wird durch "/" am Anfang und Ende eingegrenzt.
| | Beim Geltungsbereich von <code>RegExp</code>s wird zwischen ''greedy'' und ''non-greedy'' unterschieden. <code>sed</code>-<code>RegExp</code>s sind immer ''greedy'', das bedeutet, dass die <code>RegExp</code> immer den längstmöglichen Geltungsbereich hat: |
| * "/" ist also nichts anderes als ein Begrenzungszeichen, ähnlich wie Hochkommata
| |
|
| |
|
| | {| style="margin-left:2em" |
| | |- |
| | |colspan="2"| |
| | /a.*B/; "'a', gefolgt von null oder mehr beliebigen Zeichen, gefolgt von 'B'" |
|
| |
|
| | '''axyBBBskdjfhaaBBpweruB'''jdfh ; längstmöglicher Geltungsbereich (greedy) |
| | '''axyB'''BBskdjfhaaBBpweruBjdfh ; kürzestmöglicher Geltungsbereich (non-greedy) |
| | |} |
|
| |
|
| | Der Grund ist, dass <code>sed</code> auf Geschwindigkeit optimiert ist und non-greedy <code>RegExp</code>s aufwendiges [[Backtracking]] erfordern würde. Will man ein Non-greedy-Verhalten erzwingen, so erreicht man dies üblicherweise durch negierte Zeichenklassen. Im obigen Beispiel etwa: |
|
| |
|
| | {| style="margin-left:2em" |
| | |- |
| | |colspan="2"| |
| | /a[^B]*B/ ; "'a', gefolgt von null oder mehr nicht-'B', gefolgt von 'B'" |
| | |} |
|
| |
|
| Die vorige Anweisung ist unvollständig, da sie nur aus der RE '/isst/' besteht. sed muss noch mitgeteilt werden, wie mit dem Suchergebnis zu verfahren ist.
| | === Praktische Grenzen in der Shell-Programmierung === |
| | Es sollte nicht unerwähnt bleiben, dass die allerhäufigste Anwendung von <code>sed</code> (aber auch von <code>[[awk]]</code>, <code>[[Tr (Unix)|tr]]</code> und ähnlichen Filterprogrammen) in der Praxis – die Manipulation ''ad hoc'' von Ausgaben anderer Kommandos, etwa so: |
|
| |
|
| Hinter der durch die RE getroffenen Bereichsauswahl ist der Befehl anzugeben. Eine sed-Anweisung enthält also i.A. mindestens zwei Komponenten (die Bereichsauswahl kann in bestimmten Konstrukten fehlen): # Bereichsauswahl<br/>Auswahl der Zeilen, die bearbeitet werden sollen. Im vorigen Beispiel würde sich die Auswahl auf alle Zeilen beziehen, in denen "isst" vorkommt.
| | {| style="margin-left:2em" |
| # Befehl<br/>Was soll mit den ausgewählten Zeilen passieren? Der einfachste Befehl lautet "p" (print), er gibt die selektierten Zeilen am Bildschirm aus.
| | |- |
| | | |
| | ls -l /path/to/myfile | sed 's/^\([^ ][^ ]*\) .*/\1/' # gibt Filetype und Filemode aus |
| | |} |
|
| |
|
| | genaugenommen einen Missbrauch darstellt. Da jeder Aufruf eines externen Programmes die aufwendigen Systemaufrufe <code>[[Fork (Unix)#Nutzung von Fork zum Starten anderer Programme|fork()]]</code> und <code>exec()</code> erfordert, sind Shell-interne Methoden, etwa die sogenannte ''Variablenexpansion'', selbst wenn sie deutlich länger zu schreiben sind, meist dem Aufruf von externen Programmen überlegen.<ref>{{Internetquelle |url=http://www.unix.com/302248917-post19.html |titel=Comparing the Run-Time Efficiency of a ROT13 Algorithm in tr vs. ksh93 |sprache=en |zugriff=2013-03-25}}</ref> Die Faustregel dafür 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 === |
| | Aufgrund der Art wie <code>sed</code> Textmanipulationen durchführt, kann dies nicht direkt auf der Eingabedatei geschehen. Als Ausgabe wird eine von dieser getrennte Datei benötigt, die gegebenenfalls danach über die Eingangsdatei kopiert wird. |
|
| |
|
| Das vorige Beispiel wird vervollständigt:
| | {| style="margin-left:2em" |
| | |- |
| | |colspan="2"| |
| | sed '…<Anweisungen>…' /path/to/inputfile > /path/to/output |
| | mv /path/to/output /path/to/input |
| | |} |
|
| |
|
| sed '/isst/p' < sed-test.txt | | Dies ist auch so im POSIX-Standard vorgesehen. Die GNU-Version von sed bietet zusätzlich zum POSIX-Standard die Kommandozeilen-Option <code>-i</code>. Diese erlaubt es, eine Datei scheinbar ohne Umweg (''in place'') zu verändern, tatsächlich wird aber im Hintergrund ebenfalls eine temporäre Datei angelegt. Diese wird im Fehlerfall nicht gelöscht und die Metadaten (Besitzer, Gruppe, Inode-Nummer, …) der Originaldatei auf jeden Fall verändert. |
|
| |
|
| | === <code>RegExp</code>-Notation === |
| | Es hat sich eingebürgert, ''regular Expressions'' – wie auch in den obigen Beispielen – durch Schrägstriche zu begrenzen. <code>sed</code> 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: |
|
| |
|
| * Durchsuchen der Datei nach Zeilen, die "isst" enthalten
| | {| style="margin-left:2em" |
| * Die selektierten Zeilen werden am Bildschirm ausgegeben | | |- |
| * "/" umschließt die RE, hat also mit dem Befehl "p" nichts zu tun. | | |colspan="2"| |
| | s/^\([^ ][^ ]*\) \([^ ][^ ]*\)/\2 \1/ ; vertauscht erstes und zweites Wort einer Zeile |
| | s_^\([^ ][^ ]*\) \([^ ][^ ]*\)_\2 \1_ ; "_" statt "/" |
| | |} |
|
| |
|
| | Dies ist praktisch, wenn der Schrägstrich als Teil der <code>RegExp</code> benötigt wird, weil man sich dann das mühsame ''Escapen'' (Kenntlichmachen der Verwendung als [[Literal]]) ersparen kann. Man weicht dann einfach auf ein anderes, nicht verwendetes Zeichen aus. |
|
| |
|
| | === Einige typische Verfahren === |
| | ==== Löschung von Textteilen ==== |
| | Erfolgt durch ''Ersetzung durch nichts''. Explizite Löschung für Teile einer Zeile ist nur vom Zeilenbeginn bis zum ersten Zeilentrennzeichen (<code>D</code>) vorgesehen. Der Ausdruck |
|
| |
|
| | {| style="margin-left:2em" |
| | |- |
| | | |
| | /Ausdruck/d |
| | |} |
|
| |
|
| | löscht hingegen '''NICHT''' den Teil ''Ausdruck'', sondern jede Zeile, die ''Ausdruck'' enthält! ''Ausdruck'' fungiert hier als die Adresse (siehe oben, 1-Adress-Variante des Kommandos <code>d</code>). |
|
| |
|
| Leider liefert die sed-Anweisung ein unbefriedigendes Ergebnis, da alle Zeilen ausgegeben werden.
| | ==== Ansprechen von mindestens einem Zeichen ==== |
| | Im Umfang der POSIX-BREs ist – im Unterschied zu den GNU-BREs – der [[Regexp#Quantoren|Quantor]] <code>\+</code> für ''ein oder mehrere des vorangegangenen Ausdrucks'' nicht vorgesehen. Um portable <code>sed</code>-Scripte zu schreiben, die nicht nur mit GNU-sed laufen, sollte der [[Regexp#Quantoren|Quantor]] <code>\{min,\}</code> verwendet werden. |
|
| |
|
| Dies liegt an der Arbeitsweise von sed. Um das gewünschte Ergebnis zu erhalten, muss sed mit der Option "-n" aufgerufen werden:
| | {| style="margin-left:2em" |
| | | |- |
| sed -n '/isst/p' < sed-test.txt''' '''
| | |colspan="2"| |
| * beim p-Befehl immer die Option "-n" verwenden!
| | /xa\+y/ ; GNU-Variante für "'x' gefolgt von einem oder mehr (aber nicht null) 'a', gefolgt von 'y'" |
| * aufgrund der Option "-n" werden nur die Zeilen ausgegeben, in denen "isst" vorkommt.
| | /xa\{1,\}y/ ; dasselbe in POSIX: "'x' gefolgt von mindestens einem 'a', gefolgt von 'y'" |
| | | |} |
| | |
| | |
| | |
| | |
| Wenn man die Option "-e" verwendet, muss beachtet weden, dass "-n" vor "-e" steht.
| |
| | |
| sed -n -e '/isst/p' < sed-test.txt
| |
| * "-e" muss hinter "-n" stehen!
| |
| | |
| | |
| | |
| == {{anchor|RefHeading2661939995267}} Dateizeilen ausgeben ==
| |
| | |
| === {{anchor|RefHeading3008181082722535}} Ausgabe [p] ===
| |
| | |
| Zunächst wenden wir das Kommando p auf die ersten 3 Zeilen der Datei an:
| |
| | |
| '''sed '1,3p' test.txt'''
| |
| 1 Der Aufruf des Stream Editors besitzt immer das Format:
| |
| 1 Der Aufruf des Stream Editors besitzt immer das Format:
| |
| 2
| |
| 2
| |
| 3 sed 'Kommando' Dateiname
| |
| 3 sed 'Kommando' Dateiname
| |
| 4
| |
| 5 Dabei kann dem Kommando mitgeteilt werden, welche Zeilen der
| |
| 6 Eingabedatei es bearbeiten soll. Als Adressierung kommen folgende
| |
| 7 Mechanismen in Frage:
| |
| 8
| |
| 9 Keine Angabe Alle Zeilen
| |
| 10 Nummer Genau diese Zeile
| |
| 11 Start, Ende Alle Zeilen von "Start" bis "Ende"
| |
| 12 $ Symbolisiert die letzte Zeile
| |
| 13 RegEx Zeilen, die den Regulären Ausdruck enthalten
| |
| 14 1, RegEx Von Zeile 1 bis zur ersten Zeile, die RegEx enthält
| |
| | |
| Offensichtlich zeigt der Stream Editor etwas mehr an, als uns lieb ist; er gibt einfach die gesamte Datei aus und wiederholt nur die Zeilen, die durch das Kommando »1,3p« bearbeitet wurden.
| |
| | |
| === {{anchor|RefHeadingToc36301725578261}} Mehrfache Ausgaben unterbinden [-n] ===
| |
| | |
| Um solche »überflüssigen« Ausgaben zu unterbinden, muss die Option »-n« verwendet werden:
| |
| | |
| '''sed -n '1,3p' test.txt'''
| |
| 1 Der Aufruf des Stream Editors besitzt immer das Format:
| |
| 2
| |
| 3 sed 'Kommando' Dateiname
| |
| | |
| Bei der Adressierung mittels regulärer Ausdrücke müssen diese in Schrägstriche (Slashes) eingeschlossen sein:
| |
| | |
| '''sed -n '/RegEx/,/RegEx/p' test.txt'''
| |
| 13 RegEx Zeilen, die den Regulären Ausdruck enthalten
| |
| 14 1, RegEx Von Zeile 1 bis zur ersten Zeile, die RegEx enthält
| |
| | |
| === {{anchor|RefHeadingToc33331725578261}} Printing Operation in Sed ===
| |
| | |
| <span style="color:#0000ff;">Linux Sed command allows you to print only specific lines based on the line number or pattern matches. </span><span style="color:#0000ff;">'''“p”'''</span><span style="color:#0000ff;"> is a command for printing the data from the pattern buffer.</span>
| |
| | |
| <div style="color:#0000ff;">To suppress automatic printing of pattern space use -n command with sed. sed -n option will not print anything, unless an explicit request to print is found.</div>
| |
| | |
| | |
| <div style="color:#0000ff;">Syntax:</div>
| |
| <div style="color:#0000ff;"><nowiki># sed -n 'ADDRESS'p filename</nowiki></div>
| |
| | |
| <div style="color:#0000ff;"><nowiki># sed -n '/PATTERN/p' filename</nowiki></div>
| |
| | |
| <div style="color:#0000ff;">Let us first create thegeekstuff.txt file that will be used in all the examples mentioned below.</div>
| |
| | |
| <div style="color:#0000ff;"><nowiki># cat thegeekstuff.txt</nowiki></div>
| |
| <div style="color:#0000ff;">1. Linux - Sysadmin, Scripting etc.</div>
| |
| <div style="color:#0000ff;">2. Databases - Oracle, mySQL etc.</div>
| |
| <div style="color:#0000ff;">3. Hardware</div>
| |
| <div style="color:#0000ff;">4. Security (Firewall, Network, Online Security etc)</div>
| |
| <div style="color:#0000ff;">5. Storage</div>
| |
| <div style="color:#0000ff;">6. Cool gadgets and websites</div>
| |
| <div style="color:#0000ff;">7. Productivity (Too many technologies to explore, not much time available)</div>
| |
| <div style="color:#0000ff;">8. Website Design</div>
| |
| <div style="color:#0000ff;">9. Software Development</div>
| |
| <div style="color:#0000ff;">10.Windows- Sysadmin, reboot etc.</div>
| |
| | |
| == {{anchor|RefHeading25581109232536}} Adressierung ==
| |
| | |
| Es ist möglich, bestimmte Zeilen explizit auszuwählen, also z.B. "Zeile 1", "Zeile 1-2", "letzte Zeile" usw. In diesem Falle wird die Bereichsauswahl direkt angegeben, sie steht also nicht zwischen "/" wie bei RE-Ausdrücken.
| |
| | |
| Der Befehl 'p' steht direkt hinter der Bereichsauswahl.
| |
| | |
| === {{anchor|RefHeadingToc27421725578261}} Using Address and Patterns ===
| |
| | |
| <span style="color:#0000ff;">In the previous sed tutorial we discussed about </span>[http://www.thegeekstuff.com/2009/09/unix-sed-tutorial-printing-file-lines-using-address-and-patterns/ Unix sed command basics and printing lines]<span style="color:#0000ff;"> from a file using sed address and patterns.</span>
| |
| | |
| <div style="color:#0000ff;">In this article, let us review how to delete lines from a file using address and patterns with 8 awesome examples.</div>* <div style="color:#0000ff;">“p” command prints the buffer (remember to use -n option with “p”) </div>
| |
| * <span style="color:#0000ff;">“d” command is just opposite, its for deletion. </span><span style="color:#0000ff;">'''‘d’'''</span><span style="color:#0000ff;"> will delete the pattern space buffer and immediately starts the next cycle. </span><br/>
| |
| | |
| | |
| ==== Syntax ====
| |
| | |
| * <span style="color:#0000ff;"><tt>sed 'ADDRESS'd filename</tt></span>
| |
| * <span style="color:#0000ff;"><tt>sed /PATTERN/d filename</tt></span>
| |
| | |
| | |
| | |
| <div style="color:#0000ff;"></div>
| |
| | |
| <div style="color:#0000ff;">Syntax for ADDRESSES and PATTERNS given in the printing is applicable for deletion also, except -n option. (-n only to suppress printing pattern buffer, can be used with “p” command )</div>
| |
| | |
| | |
| <div style="color:#0000ff;">Let us first creates thegeekstuff.txt file that will be used in all the examples mentioned below.</div>
| |
| | |
| <div style="color:#0000ff;"><nowiki># cat thegeekstuff.txt</nowiki></div>
| |
| <div style="color:#0000ff;">1. Linux - Sysadmin, Scripting etc.</div>
| |
| <div style="color:#0000ff;">2. Databases - Oracle, mySQL etc.</div>
| |
| <div style="color:#0000ff;">3. Hardware</div>
| |
| <div style="color:#0000ff;">4. Security (Firewall, Network, Online Security etc)</div>
| |
| <div style="color:#0000ff;">5. Storage</div>
| |
| <div style="color:#0000ff;">6. Cool gadgets and websites</div>
| |
| <div style="color:#0000ff;">7. Productivity (Too many technologies to explore, not much time available)</div>
| |
| <div style="color:#0000ff;">8. Website Design</div>
| |
| <div style="color:#0000ff;">9. Software Development</div>
| |
| <div style="color:#0000ff;">10.Windows- Sysadmin, reboot etc.</div>
| |
| | |
| === {{anchor|RefHeadingToc32101725578261}} ADDRESS Format Beispiele ===
| |
| | |
| ==== NUMBER ====
| |
| | |
| This will match only Nth line in the input.
| |
| | |
| '''<nowiki># sed -n ‘N’p filename</nowiki>''' | |
| | |
| For example, 3p prints third line of input file thegeekstuff.txt as shown below.
| |
| | |
| <nowiki># sed -n '3'p thegeekstuff.txt</nowiki>
| |
| 3. Hardware
| |
| | |
| ===== {{anchor|RefHeadingToc28281725578261}} Erste Zeile ausgeben =====
| |
| | |
| sed -n '1p' < sed-test.txt
| |
| | |
| Option "-n" nicht vergessen!
| |
| | |
| ==== NUMBER1~NUMBER2 ====
| |
| | |
| <div style="color:#0000ff;">M~N with “p” command prints every Nth line starting from line M.</div>
| |
| | |
| <span style="color:#0000ff;">'''<nowiki># sed -n ‘M~N’p filename</nowiki>'''</span>
| |
| | |
| <div style="color:#0000ff;">For example, 3~2p prints every 2nd line starting from 3rd line as shown below.</div>
| |
| | |
| <div style="color:#0000ff;"><nowiki># sed -n '3~2'p thegeekstuff.txt</nowiki></div>
| |
| <div style="color:#0000ff;">3. Hardware</div>
| |
| <div style="color:#0000ff;">5. Storage</div>
| |
| <div style="color:#0000ff;">7. Productivity (Too many technologies to explore, not much time available)</div>
| |
| <div style="color:#0000ff;">9. Software Development</div>
| |
| | |
| ==== START, END ====
| |
| | |
| <div style="color:#0000ff;">M,N with “p” command prints Mth line to Nth line.</div>
| |
| | |
| <span style="color:#0000ff;">'''<nowiki># sed -n ‘M,N’p filename</nowiki>'''</span>
| |
|
| |
|
| <div style="color:#0000ff;">For example, 4,8p prints from 4th line to 8th line from input file thegeekstuff.txt</div>
| | ==== Ersetzung mehrerer bzw. aller Vorkommen innerhalb einer Zeile ==== |
| | Ohne Angabe weiterer Optionen wird immer nur das erste Vorkommen eines Suchtexts der Ersetzungsregel unterworfen: |
|
| |
|
| <div style="color:#0000ff;"><nowiki># sed -n '4,8'p thegeekstuff.txt</nowiki></div>
| | {| style="margin-left:2em" |
| <div style="color:#0000ff;">4. Security (Firewall, Network, Online Security etc)</div>
| |
| <div style="color:#0000ff;">5. Storage</div>
| |
| <div style="color:#0000ff;">6. Cool gadgets and websites</div>
| |
| <div style="color:#0000ff;">7. Productivity (Too many technologies to explore, not much time available)</div>
| |
| <div style="color:#0000ff;">8. Website Design</div>
| |
| | |
| ==== ‘$’ Last Line ====
| |
| | |
| <div style="color:#0000ff;">$ with “p” command matches only the last line from the input.</div>
| |
| | |
| <span style="color:#0000ff;">'''<nowiki># sed -n ‘$’p filename</nowiki>'''</span>
| |
| | |
| <div style="color:#0000ff;">For example, $p prints only the last line as shown below.</div>
| |
| | |
| <div style="color:#0000ff;"><nowiki># sed -n '$'p thegeekstuff.txt</nowiki></div>
| |
| <div style="color:#0000ff;">10.Windows- Sysadmin, reboot etc.</div>
| |
| | |
| ==== NUMBER,$ ====
| |
| | |
| <div style="color:#0000ff;">N,$ with “p” command prints from Nth line to end of file.</div>
| |
| | |
| <span style="color:#0000ff;">'''<nowiki># sed -n ‘N,$p’ filename</nowiki>'''</span>
| |
| | |
| <div style="color:#0000ff;">For example 4,$p prints from 4th line to end of file.</div>
| |
| | |
| <div style="color:#0000ff;"><nowiki># sed -n '4,$p' thegeekstuff.txt</nowiki></div>
| |
| <div style="color:#0000ff;">4. Security (Firewall, Network, Online Security etc)</div>
| |
| <div style="color:#0000ff;">5. Storage</div>
| |
| <div style="color:#0000ff;">6. Cool gadgets and websites</div>
| |
| <div style="color:#0000ff;">7. Productivity (Too many technologies to explore, not much time available)</div>
| |
| <div style="color:#0000ff;">8. Website Design</div>
| |
| <div style="color:#0000ff;">9. Software Development</div>
| |
| <div style="color:#0000ff;">10.Windows- Sysadmin, reboot etc.</div>
| |
| | |
| ===== {{anchor|RefHeadingToc28301725578261}} Letzte Zeile ausgeben =====
| |
| | |
| sed -n '$p' < sed-test.txt
| |
| | |
| === {{anchor|RefHeadingToc32121725578261}} PATTERN Format Beispiele ===
| |
| | |
| ==== PATTERN ====
| |
| | |
| <div style="color:#0000ff;">PATTERN could be unix regular expression. The below command prints only the line which matches the given pattern.</div>
| |
| | |
| <span style="color:#0000ff;">'''<nowiki># sed -n /PATTERN/p filename</nowiki>'''</span>
| |
| | |
| <div style="color:#0000ff;">For example, following prints the line only which matches the pattern “Sysadmin”.</div>
| |
| | |
| <div style="color:#0000ff;"><nowiki># sed -n /Sysadmin/p thegeekstuff.txt</nowiki></div>
| |
| <div style="color:#0000ff;">1. Linux - Sysadmin, Scripting etc.</div>
| |
| <div style="color:#0000ff;">10.Windows- Sysadmin, reboot etc.</div>
| |
| | |
| ==== /PATTERN/,ADDRESS ====
| |
| | |
| <span style="color:#0000ff;">'''<nowiki># sed -n ‘/PATTERN/,Np’ filename</nowiki>'''</span>
| |
| | |
| <div style="color:#0000ff;">For example, following prints lines which matches the pattern to Nth line, from input. 3rd line matches the pattern “Hardware”, so it prints from 3rd line to 6th line.</div>
| |
| | |
| <div style="color:#0000ff;"><nowiki># sed -n '/Hardware/,6p' thegeekstuff.txt</nowiki></div>
| |
| <div style="color:#0000ff;">3. Hardware</div>
| |
| <div style="color:#0000ff;">4. Security (Firewall, Network, Online Security etc)</div>
| |
| <div style="color:#0000ff;">5. Storage</div>
| |
| <div style="color:#0000ff;">6. Cool gadgets and websites</div>
| |
| | |
| ==== ADDRESS,/PATTERN/ ====
| |
| | |
| <div style="color:#0000ff;">It prints from the Nth line of the input, to the line which matches the pattern. If the pattern doesnt match, it prints upto end of the input.</div>
| |
| | |
| <span style="color:#0000ff;">'''<nowiki># sed -n ‘N,/PATTERN/p’ filename</nowiki>'''</span>
| |
| | |
| <div style="color:#0000ff;">For example, 4th line matches the pattern “Security”, so it prints from 3rd line to 4th line.</div>
| |
| | |
| <div style="color:#0000ff;"><nowiki># sed -n '3,/Security/p' thegeekstuff.txt</nowiki></div>
| |
| <div style="color:#0000ff;">3. Hardware</div>
| |
| <div style="color:#0000ff;">4. Security (Firewall, Network, Online Security etc)</div>
| |
| | |
| ==== /PATTERN/,$ ====
| |
| | |
| <div style="color:#0000ff;">It prints from the line matches the given pattern to end of file.</div>
| |
| | |
| <span style="color:#0000ff;">'''<nowiki># sed -n ‘/PATTERN/,$p’ filename</nowiki>'''</span>
| |
| | |
| <div style="color:#0000ff;"><nowiki># sed -n '/Website/,$p' thegeekstuff.txt</nowiki></div>
| |
| <div style="color:#0000ff;">8. Website Design</div>
| |
| <div style="color:#0000ff;">9. Software Development</div>
| |
| <div style="color:#0000ff;">10.Windows- Sysadmin, reboot etc.</div>
| |
| | |
| ==== /PATTERN/,+N ====
| |
| | |
| <div style="color:#0000ff;">It prints the lines which matches the pattern and next N lines following the matched line.</div>
| |
| | |
| <span style="color:#0000ff;">'''<nowiki># sed -n ‘/PATTERN/,+Np’ filename</nowiki>'''</span>
| |
| | |
| <div style="color:#0000ff;">For example, following prints the 5th line which matches the pattern /Storage/ and next two lines following /Storage/.</div>
| |
| | |
| <div style="color:#0000ff;"><nowiki># sed -n '/Storage/,+2p' thegeekstuff.txt</nowiki></div>
| |
| <div style="color:#0000ff;">5. Storage</div>
| |
| <div style="color:#0000ff;">6. Cool gadgets and websites</div>
| |
| <div style="color:#0000ff;">7. Productivity (Too many technologies to explore, not much time available)</div>
| |
| | |
| ==== /PATTERN/,/PATTERN/ ====
| |
| | |
| <div style="color:#0000ff;">Prints the section of file between two regular expression (including the matched line ).</div>
| |
| | |
| <span style="color:#0000ff;">'''<nowiki># sed -n ‘/P1/,/P2/p’ filename</nowiki>'''</span>
| |
| | |
| <div style="color:#0000ff;">For example, 5th line matches “Storage” and 8th line matches “Design”, so it prints 5th to 8th.</div>
| |
| | |
| <div style="color:#0000ff;"><nowiki># sed -n '/Storage/,/Design/p' thegeekstuff.txt</nowiki></div>
| |
| <div style="color:#0000ff;">5. Storage</div>
| |
| <div style="color:#0000ff;">6. Cool gadgets and websites</div>
| |
| <div style="color:#0000ff;">7. Productivity (Too many technologies to explore, not much time available)</div>
| |
| <div style="color:#0000ff;">8. Website Design</div>
| |
| | |
| === {{anchor|RefHeading25589109232536}} Besondere Zeichen ===
| |
| | |
| ==== Negation ====
| |
| | |
| Das Ausrufezeichen ("!") hinter der Bereichsauswahl bewirkt eine Negation
| |
| | |
| sed '/isst/!d' < sed-test.txt
| |
| * Zeilen, die "isst" nicht enthalten, werden nicht ausgegeben<br/>
| |
| | |
| | |
| sed -n '1!p' < sed-test.txt
| |
| * alle Zeilen außer Zeile 1 werden ausgegeben
| |
| | |
| | |
| | |
| ==== $-Zeichen: letztes Element ====
| |
| | |
| Das $-Zeichen steht bei der Bereichsauswahl für "letzte Zeile":
| |
| | |
| sed -n '$p' < sed-test.txt
| |
| * letzte Zeile ausgeben
| |
| | |
| | |
| | |
| | |
| | |
| In einer RE steht das $-Zeichen für "Zeilenende"
| |
| | |
| sed -n '/Zeile$/p' < sed-test.txt
| |
| * Zeilen ausgeben, in denen "Zeile" am Ende steht
| |
| | |
| | |
| | |
| | |
| | |
| Möchte man dem Zeilenende eine Zeichenkette anhängen, genügt ein $ als Suchmuster:
| |
| | |
| sed -n 's/$/ und Schluss!/p' < sed-test.txt
| |
| * Jede Zeile endet mit ' und Schluss!'
| |
| | |
| | |
| | |
| ==== ^ - Zeichen ====
| |
| | |
| Das ^-Zeichen steht in einer RE für Zeilenanfang:
| |
| | |
| sed -n '/^Hier/p' < sed-test.txt
| |
| * Zeilen ausgeben, in denen "Hier" am Anfang steht<br/>
| |
| | |
| | |
| Innerhalb einer Zeichenklasse in einer RE steht es für Verneinung.
| |
| | |
| sed -n '/F[^e]hler/p' < sed-test.txt
| |
| * Zeilen ausgeben, in denen das Wort "F.hler" vorkommt, wobei der 2. Buchstabe kein "e" sein darf<br/>
| |
| | |
| | |
| Möchte man dem Zeilenanfang eine Zeichenkette voranstellen genügt ein ^ als Suchmuster:
| |
| | |
| sed -n 's/^/Am Anfang stand /p' < sed-test.txt
| |
| * Jede Zeile beginnt mit 'Am Anfang stand '
| |
| | |
| | |
| | |
| == {{anchor|RefHeading14699762120244}} Zeilen löschen ==
| |
| | |
| === {{anchor|RefHeading3008201082722535}} Löschen [d] ===
| |
| | |
| Der nachfolgende Aufruf löscht alle Zeilen ab der (einschließlich) 4. bis zum Dateiende:
| |
| | |
| '''sed '4,$d' test.txt'''
| |
| 1 Der Aufruf des Stream Editors besitzt immer das Format:
| |
| 2
| |
| 3 sed 'Kommando' Dateiname
| |
| | |
| Das Entfernen aller Zeilen, die mit einem Leerzeichen beginnen, erledigt dieser Aufruf:
| |
| | |
| '''sed '/^ /d' test.txt'''
| |
| 10 Nummer Genau diese Zeile
| |
| 11 Start, Ende Alle Zeilen von "Start" bis "Ende"
| |
| 12 $ Symbolisiert die letzte Zeile
| |
| 13 RegEx Zeilen, die den Regulären Ausdruck enthalten
| |
| 14 1, RegEx Von Zeile 1 bis zur ersten Zeile, die RegEx enthält
| |
| | |
| Der delete-Befehl ist die Umkehrung des print-Befehls: Die bei der Bereichsauswahl (mittels RE oder explizit) selektierten Zeilen werden "gelöscht", also nicht ausgegeben.
| |
| | |
| sed '/isst/d' < sed-test.txt
| |
| * Zeilen, die "isst" enthalten, werden nicht ausgegeben
| |
| | |
| | |
| | |
| | |
| | |
| sed '3d' < sed-test.txt
| |
| * die dritte Zeile wird nicht ausgegeben
| |
| | |
| | |
| | |
| === {{anchor|RefHeadingToc35311725578261}} Beispiele ===
| |
| | |
| ==== {{anchor|RefHeadingToc27441725578261}} Lösche die Nte Zeile ====
| |
| | |
| <div style="color:#0000ff;">‘Nd’ deletes the Nth line and prints the other lines.</div>
| |
| | |
| <span style="color:#0000ff;">'''sed ‘Nd’ filename'''</span>
| |
| | |
| <div style="color:#0000ff;">As per sed methodology,</div>* <div style="color:#0000ff;">It reads the first line and places in its pattern buffer. </div>
| |
| * <div style="color:#0000ff;">Check whether supplied command is true for this line, if true, deletes pattern space buffer and starts next cycle. i.e Read next line. </div>
| |
| * <div style="color:#0000ff;">If supplied command doesnt true, as its normal behaviour it prints the content of the pattern space buffer. </div>
| |
| | |
| | |
| | |
| <div style="color:#0000ff;">For example, 3d deletes 3rd line and prints other lines as shown below.</div>
| |
| | |
| <div style="color:#0000ff;">sed 3d thegeekstuff.txt</div>
| |
| <div style="color:#0000ff;">1. Linux - Sysadmin, Scripting etc.</div>
| |
| <div style="color:#0000ff;">2. Databases - Oracle, mySQL etc.</div>
| |
| <div style="color:#0000ff;">4. Security (Firewall, Network, Online Security etc)</div>
| |
| <div style="color:#0000ff;">5. Storage</div>
| |
| <div style="color:#0000ff;">6. Cool gadgets and websites</div>
| |
| <div style="color:#0000ff;">7. Productivity (Too many technologies to explore, not much time available)</div>
| |
| <div style="color:#0000ff;">8. Website Design</div>
| |
| <div style="color:#0000ff;">9. Software Development</div>
| |
| <div style="color:#0000ff;">10.Windows- Sysadmin, reboot etc.</div>
| |
| | |
| ==== {{anchor|RefHeadingToc27461725578261}} Delete Starting from 3rd line and every 2nd line from there. ====
| |
| | |
| <div style="color:#0000ff;">sed '3~2d' thegeekstuff.txt</div>
| |
| <div style="color:#0000ff;">1. Linux - Sysadmin, Scripting etc.</div>
| |
| <div style="color:#0000ff;">2. Databases - Oracle, mySQL etc.</div>
| |
| <div style="color:#0000ff;">4. Security (Firewall, Network, Online Security etc)</div>
| |
| <div style="color:#0000ff;">6. Cool gadgets and websites</div>
| |
| <div style="color:#0000ff;">8. Website Design</div>
| |
| <div style="color:#0000ff;">10.Windows- Sysadmin, reboot etc.</div>
| |
| | |
| ==== {{anchor|RefHeadingToc27481725578261}} Delete from 4th to 8th line from file. ====
| |
| | |
| <div style="color:#0000ff;">sed '4,8d' thegeekstuff.txt</div>
| |
| <div style="color:#0000ff;">1. Linux - Sysadmin, Scripting etc.</div>
| |
| <div style="color:#0000ff;">2. Databases - Oracle, mySQL etc.</div>
| |
| <div style="color:#0000ff;">3. Hardware</div>
| |
| <div style="color:#0000ff;">9. Software Development</div>
| |
| <div style="color:#0000ff;">10.Windows- Sysadmin, reboot etc.</div>
| |
| | |
| ==== {{anchor|RefHeadingToc27501725578261}} Delete the last line from input. ====
| |
| | |
| <div style="color:#0000ff;">sed '$d' thegeekstuff.txt</div>
| |
| <div style="color:#0000ff;">1. Linux - Sysadmin, Scripting etc.</div>
| |
| <div style="color:#0000ff;">2. Databases - Oracle, mySQL etc.</div>
| |
| <div style="color:#0000ff;">3. Hardware</div>
| |
| <div style="color:#0000ff;">4. Security (Firewall, Network, Online Security etc)</div>
| |
| <div style="color:#0000ff;">5. Storage</div>
| |
| <div style="color:#0000ff;">6. Cool gadgets and websites</div>
| |
| <div style="color:#0000ff;">7. Productivity (Too many technologies to explore, not much time available)</div>
| |
| <div style="color:#0000ff;">8. Website Design</div>
| |
| <div style="color:#0000ff;">9. Software Development</div>
| |
| | |
| ==== {{anchor|RefHeadingToc27521725578261}} Delete the line which matches the given pattern from input. ====
| |
| | |
| <div style="color:#0000ff;">For example, the below command deletes the line which matches with “Sysadmin”.</div>
| |
| | |
| <div style="color:#0000ff;">sed /Sysadmin/d thegeekstuff.txt</div>
| |
| <div style="color:#0000ff;">2. Databases - Oracle, mySQL etc.</div>
| |
| <div style="color:#0000ff;">3. Hardware</div>
| |
| <div style="color:#0000ff;">4. Security (Firewall, Network, Online Security etc)</div>
| |
| <div style="color:#0000ff;">5. Storage</div>
| |
| <div style="color:#0000ff;">6. Cool gadgets and websites</div>
| |
| <div style="color:#0000ff;">7. Productivity (Too many technologies to explore, not much time available)</div>
| |
| <div style="color:#0000ff;">8. Website Design</div>
| |
| <div style="color:#0000ff;">9. Software Development</div>
| |
| | |
| ==== {{anchor|RefHeadingToc27541725578261}} Deletes the line from which matches the given pattern to end of the file. ====
| |
| | |
| <div style="color:#0000ff;">sed '/Website/,$d' thegeekstuff.txt</div>
| |
| <div style="color:#0000ff;">1. Linux - Sysadmin, Scripting etc.</div>
| |
| <div style="color:#0000ff;">2. Databases - Oracle, mySQL etc.</div>
| |
| <div style="color:#0000ff;">3. Hardware</div>
| |
| <div style="color:#0000ff;">4. Security (Firewall, Network, Online Security etc)</div>
| |
| <div style="color:#0000ff;">5. Storage</div>
| |
| <div style="color:#0000ff;">6. Cool gadgets and websites</div>
| |
| <div style="color:#0000ff;">7. Productivity (Too many technologies to explore, not much time available)</div>
| |
| | |
| ==== {{anchor|RefHeadingToc27561725578261}} Deletes the line from which matches the given pattern and 2lines next to that. ====
| |
| | |
| <div style="color:#0000ff;">sed '/Storage/,+2d' thegeekstuff.txt</div>
| |
| <div style="color:#0000ff;">1. Linux - Sysadmin, Scripting etc.</div>
| |
| <div style="color:#0000ff;">2. Databases - Oracle, mySQL etc.</div>
| |
| <div style="color:#0000ff;">3. Hardware</div>
| |
| <div style="color:#0000ff;">4. Security (Firewall, Network, Online Security etc)</div>
| |
| <div style="color:#0000ff;">8. Website Design</div>
| |
| <div style="color:#0000ff;">9. Software Development</div>
| |
| <div style="color:#0000ff;">10.Windows- Sysadmin, reboot etc.</div>
| |
| | |
| ==== {{anchor|RefHeadingToc27581725578261}} Delete blank Line from a file using sed ====
| |
| | |
| <div style="color:#0000ff;">You can also remove blank lines with sed. The following sed example shows how to use sed and remove blank lines.</div>
| |
| | |
| <div style="color:#0000ff;">sed '/^$/d' thegeekstuff.txt</div>
| |
| <div style="color:#0000ff;">1. Linux - Sysadmin, Scripting etc.</div>
| |
| <div style="color:#0000ff;">2. Databases - Oracle, mySQL etc.</div>
| |
| <div style="color:#0000ff;">3. Hardware</div>
| |
| <div style="color:#0000ff;">4. Security (Firewall, Network, Online Security etc)</div>
| |
| <div style="color:#0000ff;">5. Storage</div>
| |
| <div style="color:#0000ff;">6. Cool gadgets and websites</div>
| |
| <div style="color:#0000ff;">7. Productivity (Too many technologies to explore, not much time available)</div>
| |
| <div style="color:#0000ff;">8. Website Design</div>
| |
| <div style="color:#0000ff;">9. Software Development</div>
| |
| <div style="color:#0000ff;">10.Windows- Sysadmin, reboot etc.</div>
| |
| | |
| == {{anchor|RefHeading25583109232536}} Suchen und Ersetzen ==
| |
| | |
| In diesem Falle steht das Trennzeichen "/" an drei Stellen: vor und hinter der RE, also dem Suchmuster und hinter dem Ersetzungsmuster.
| |
| | |
| Der mittlere Schrägstrich ist also Ende-Delimiter für die RE und gleichzeitig Anfangs-Delimiter für den Ersetzungsstring.
| |
| | |
| Logischer Weise müsste der Schrägstrich viermal vorkommen, aber sed hat die beiden mittleren Schrägstriche zu einem verschmolzen.
| |
| | |
| === {{anchor|RefHeading3008221082722535}} Zeichen ersetzen [s] ===
| |
| | |
| Das dem s-Kommando folgende Zeichen wird als Trennzeichen angesehen.
| |
| | |
| Anschließend folgt das Suchmuster und, getrennt durch das Trennzeichen, das Ersatzmuster, welches wiederum mittels des Trennzeichens abgeschlossen wird.
| |
| | |
| Prinzipiell kann jedes druckbare Zeichen als Trennzeichen Verwendung finden, es selbst darf allerdings kein Bestandteil eines Musters sein!
| |
| | |
| Eine Substitution sieht demnach wie folgt aus:
| |
| | |
| sed 's/altes Muster/neues Muster/' datei
| |
| sed 's?altes Muster?neues Muster?' datei
| |
| | |
| Im Beispiel ersetzen wir »RegEx« durch »Regulärer Ausdruck«:
| |
| | |
| sed 's#RegEx#Regulärer Ausdruck#' test.txt
| |
| 1 Der Aufruf des Stream Editors besitzt immer das Format:
| |
| 2
| |
| 3 sed 'Kommando' Dateiname
| |
| 4
| |
| 5 Dabei kann dem Kommando mitgeteilt werden, welche Zeilen der
| |
| 6 Eingabedatei es bearbeiten soll. Als Adressierung kommen folgende
| |
| 7 Mechanismen in Frage:
| |
| 8
| |
| 9 Keine Angabe Alle Zeilen
| |
| 10 Nummer Genau diese Zeile
| |
| 11 Start, Ende Alle Zeilen von "Start" bis "Ende" 12 $ Symbolisiert die letzte Zeile
| |
| 13 Regulärer Ausdruck Zeilen, die den Regulären Ausdruck enthalten
| |
| 14 1, Regulärer Ausdruck Von Zeile 1 bis zur ersten Zeile, die RegEx enthält
| |
| | |
| === {{anchor|RefHeadingToc48311725578261}} Globale Substitution ===
| |
| | |
| Wer genau hinschaut, wird im letzten Beispiel eine fehlende Ersetzung von »RegEx« bemerkt haben (Zeile 14). Der Editor bearbeitet in jeder Zeile nur das erste Vorkommen. Um alle Muster zu ersetzen, ist das Kommando »g« nachzustellen:
| |
| | |
| '''sed -n 's#RegEx#Regulärer Ausdruck#gp' test.txt'''
| |
| 13 Regulärer Ausdruck Zeilen, die den Regulären Ausdruck enthalten
| |
| 14 1, Regulärer Ausdruck Von Zeile 1 bis zur ersten Zeile, die Regulärer Ausdruck enthält
| |
| | |
| Da wir nur an den modifizierten Zeilen interessiert sind, haben wir das Sed mitgeteilt (Option -n).
| |
| | |
| Allerdings würde nun das Substitutionskommando die gesamte Ausgabe unterdrücken, hätten wir dem nicht mit dem p-Kommando entgegen gewirkt.
| |
| | |
| ==== Speichern von Mustern und den späteren Zugriff darauf ====
| |
| | |
| Es soll die Numerierung der Zeilen von Einer- auf Zehnerschritte erhöht werden:
| |
| | |
| '''<nowiki>sed 's/^\([[:space:]]*[1-9]\{1,\}\)/\10/' test.txt</nowiki>'''
| |
| 10 Der Aufruf des Stream Editors besitzt immer das Format:
| |
| 20
| |
| 30 sed 'Kommando' Dateiname
| |
| 40
| |
| 50 Dabei kann dem Kommando mitgeteilt werden, welche Zeilen der
| |
| 60 Eingabedatei es bearbeiten soll. Als Adressierung kommen folgende
| |
| 70 Mechanismen in Frage:
| |
| 80
| |
| 90 Keine Angabe Alle Zeilen
| |
| 100 Nummer Genau diese Zeile
| |
| 110 Start, Ende Alle Zeilen von "Start" bis "Ende"
| |
| 120 $ Symbolisiert die letzte Zeile
| |
| 130 RegEx Zeilen, die den Regulären Ausdruck enthalten
| |
| 140 1, RegEx Von Zeile 1 bis zur ersten Zeile, die RegEx enthält* Das Beispiel profitiert von dem Wissen, dass die Zeilenummer am Beginn der Zeile zu finden ist.
| |
| * Das Muster, dem unser Interesse gilt, sind alle Ziffern zu Beginn der Zeile, wobei führende Leerzeichen durchaus möglich sind.
| |
| * Genau jenes Muster merken wir uns für den späteren Gebrauch vor, indem wir es in »\(...\)« einschließen.
| |
| * Der Zugriff auf dieses erste gespeicherte Muster im Ersatzmuster erfolgt durch »\1«. <br/>Bis zu 9 Muster lassen sich pro Zeile speichern, die entsprechend ihrer Reihenfolge mittels \1, \2,... \9 referenziert werden.
| |
| | |
| | |
| | |
| ==== Beispiel ====
| |
| | |
| "isst" soll in allen Zeilen durch "ist" ersetzt werden. Eigentlich müssten pro String ein Anfangs-/Ende-Delimiter verwendet werden.
| |
| | |
| /isst//ist/
| |
| * beide Strings müssten durch "/" begrenzt werden
| |
| * sed verschmilzt die mittleren Schrägstriche zu einem!
| |
| | |
| | |
| | |
| | |
| | |
| /isst/ist/
| |
| * <nowiki># dies erscheint zunächst unlogisch.</nowiki>
| |
| | |
| | |
| | |
| | |
| | |
| Der Befehl "s" für "suchen & ersetzen" steht vor(!) der RE.
| |
| | |
| sed 's/isst/ist/' < sed-test.txt
| |
| * Befehl "s" steht am Anfang!
| |
| * sed selektiert alle Zeilen, in denen "isst" vorkommt, ersetzt "isst" durch "ist"
| |
| * und gibt das Ergebnis am Bildschirm aus
| |
| | |
| | |
| | |
| | |
| | |
| Um die Änderungen in die Datei zu schreiben, gibt es zwei Möglichkeiten:
| |
| | |
| ===== mit Hilfe einer temporären Datei =====
| |
| | |
| sed 's/isst/ist/' < sed-test.txt > sed-test2.txt * Ausgabe in temporäre Datei umleiten
| |
| | |
| | |
| | |
| vim sed-test2.txt* Ergebnis kontrollieren!
| |
| | |
| | |
| | |
| mv sed-test2.txt sed-test.txt* Originaldatei ersetzen durch temporäre Datei
| |
| | |
| | |
| | |
| ===== direkt =====
| |
| | |
| sed -i 's/isst/ist/' sed-test.txt* Vorsicht, Änderungen werden direkt in Datei geschrieben!
| |
| | |
| | |
| | |
| Im Beispiel würde sed in jeder Zeile nur das erste gefundene "isst" durch "ist" ersetzen. Um zu erreichen, dass alle Fundstellen geändert werden, muss ans Ende der Anweisung der g-Spezifizierer (=global) gesetzt werden:
| |
| | |
| sed 's/isst/ist/g' < sed-test.txt
| |
| | |
| === {{anchor|RefHeading25585109232536}} Selektives Suchen und Ersetzen ===
| |
| | |
| Beim "normalen" Suchen und Ersetzen werden alle Zeilen in den Suchvorgang einbezogen. Es kommt jedoch vor, dass die Ersetzung nur innerhalb eines bestimmten Bereiches erfolgen soll. Die Bereichsauswahl kann, wie oben beschrieben, über eine RE oder explizit erfolgen.
| |
| | |
| ==== Beispiel ====
| |
| | |
| Ans Ende aller Zeilen, in denen "isst" vorkommt, soll " --Fehler!" angehängt werden. Das normale Suchen und Ersetzen hilft hierbei nicht weiter, denn "isst" soll ja nicht ersetzt werden, sondern dient nur Selektion der Zeilen, an die das Suffix angehängt werden soll.
| |
| | |
| Es sind also zwei Vorgänge erforderlich:* Bereichsauswahl über die RE "/isst/"
| |
| * Suchen des Zeilenendes und ersetzen durch " --Fehler!".
| |
| | |
| | |
| | |
| Genau genommen wird nicht das Zeilenende ersetzt, sondern ein gedachte fiktives "leer-Zeichen" (sozusagen "") vor dem Zeilenende.
| |
| | |
| Damit sed weiß, dass sich Suchen und Ersetzen nur auf die Bereichsauswahl bezieht, steht es hinter der Bereichsauswahl in geschweiften Klammern. Sie können auch weggelassen werden. Ich rate jedoch dazu, sie zu verwenden, da die Logik des Befehls dadurch klarer wird.
| |
| | |
| | |
| sed '/isst/{s/$/ --Fehler!/}' < sed-test.txt
| |
| * /isst/ -> Bereichsauswahl über RE
| |
| * {...} -> Anweisung in "{...}" bezieht sich auf die vorangestellte Bereichsauswahl
| |
| * $ -> Platzhalterzeichen für "Zeilenende" (in Suchen & Ersetzen Anweisungen)
| |
| * s/$/ --Fehler!/ -> fiktives "leer-Zeichen" vor dem Zeilenende wird ersetzt durch " --Fehler!"
| |
| | |
| | |
| | |
| Bei expliziter Bereichsauswahl funktioniert dies analog.
| |
| | |
| ==== Beispiel ====
| |
| | |
| Ans Ende der 2. und 3. Zeile soll " --Fehler!" gesetzt werden.
| |
| | |
| sed '2,3{s/$/ --Fehler!/}' < sed-test.txt
| |
| * 2,3 -> explizite Bereichsauswahl: Zeile 2-3
| |
| | |
| | |
| | |
| Beachten Sie, dass die explizite Bereichsauswahl durch keine Delimiterzeichen "/" eingegrenzt ist.
| |
| | |
| ==== Beispiel ====
| |
| | |
| Ans Ende der letzten Zeile soll " --Ende" gesetzt werden.
| |
| | |
| sed '${s/$/ --Fehler!/}' < sed-test.txt
| |
| * <nowiki># $ </nowiki>-> explizite Bereichsauswahl; "$" steht hier für "letzte Zeile"
| |
| | |
| | |
| | |
| ==== Beispiel ====
| |
| | |
| an den Anfang der ersten Zeile soll "Anfang--" gesetzt werden.
| |
| | |
| sed '1{s/^/Anfang--/}' < sed-test.txt
| |
| * 1 -> explizite Bereichsauswahl
| |
| * ^ -> Platzhalterzeichen für "Zeilenanfang"
| |
| * ein fiktives "leer-Zeichen" ("") am Zeilenanfang wird ersetzt durch "Anfang--"
| |
| | |
| | |
| | |
| | |
| | |
| Der vorige Befehl funktioniert auch ohne {}, ist aber schwerer zu lesen:
| |
| | |
| sed '1s/^/Anfang--/' < sed-test.txt
| |
| | |
| === {{anchor|RefHeading39741624094027}} Control-Character ===
| |
| | |
| Mit Hilfe von sed können verschiedenste Konvertierungen durchgeführt werden, z.B. von DOS- (CR-LF) zu Unix Dateiendezeichen (LF). Control-Character können entweder als escape-character oder als hexadezimal-character dargestellt werden.
| |
| | |
| ==== {{anchor|RefHeadingToc27361725578261}} Wichtige control-character ====
| |
| | |
| Bezeichnung escape hex "cat -A"
| |
| linefeed \n \x0a $
| |
| carriage-return \r \x0d ^M
| |
| tab \t \x09 ^I
| |
| | |
| | |
| Kontrollzeichen innerhalb von Variablen lassen sich auch sehr gut mit Hilfe des l-Befehls von sed am Bildschirm darstellen. Dies ist eine Alternative zu "cat -A"
| |
| | |
| | |
| a=$'Tabulator: \x09 CR: \x0d LF: \x0a'
| |
| echo -e "$a" | sed -n 'l'
| |
| | |
| ==== {{anchor|RefHeadingToc27381725578261}} Escape-character ====
| |
| | |
| a="Zeile1\r\nZeile2"
| |
| | |
| am Ende von Zeile1 steht CR-LF (=DOS-Zeilenende)
| |
| | |
| echo -e "$a" | cat -A
| |
| | |
| Inhalt wird inkl. Kontrollzeichen ausgegeben und darstellbar gemacht (cat -A), der carriage-return wird als ^M dargestellt (0x0D)
| |
| | |
| echo -e "$a" | sed 's/\r//' | cat -A
| |
| | |
| der carriage-return wird durch "leer" ersetzt, ^M wird nicht mehr angezeigt
| |
| | |
| unset a
| |
| | |
| ==== {{anchor|RefHeadingToc27401725578261}} Hexadezimal-character ====
| |
| | |
| a=$'Zeile1\x0d\x0aZeile2'
| |
| | |
| am Ende von Zeile1 steht CR-LF (0x0d+0x0a)
| |
| | |
| | |
| echo -e "$a" | cat -A
| |
| echo -e "$a" | sed 's/\x0d//' | cat -A
| |
| unset a
| |
| | |
| === {{anchor|RefHeading14701762120244}} Beispiele ===
| |
| | |
| ==== {{anchor|RefHeadingToc27601725578261}} Text in Dateien mit RegEx ====
| |
| | |
| <div style="color:#0000ff;">In this article let us review how to use sed substitute command “s”. The `s’ command is probably the most important in `sed’ and has a lot of different options.</div>
| |
| | |
| <div style="color:#0000ff;">The `s’ command attempts to match the pattern space against the supplied REGEXP; if the match is successful, then that portion of the pattern space which was matched is replaced with REPLACEMENT.</div>
| |
| | |
| <div style="color:#0000ff;">Syntax:</div>
| |
| <div style="color:#0000ff;"><nowiki>#sed 'ADDRESSs/REGEXP/REPLACEMENT/FLAGS' filename</nowiki></div>
| |
| <div style="color:#0000ff;"><nowiki>#sed 'PATTERNs/REGEXP/REPLACEMENT/FLAGS' filename</nowiki></div><div style="color:#0000ff;"></div>
| |
| * <div style="color:#0000ff;">s is substitute command</div>
| |
| * <div style="color:#0000ff;">/ is a delimiter</div>
| |
| * <div style="color:#0000ff;">REGEXP is regular expression to match</div>
| |
| * <div style="color:#0000ff;">REPLACEMENT is a value to replace</div>
| |
| | |
| | |
| | |
| <div style="color:#0000ff;"></div>
| |
| | |
| <div style="color:#0000ff;">FLAGS can be any of the following</div>* <div style="color:#0000ff;">g Replace all the instance of REGEXP with REPLACEMENT</div>
| |
| * <div style="color:#0000ff;">n Could be any number,replace nth instance of the REGEXP with REPLACEMENT.</div>
| |
| * <div style="color:#0000ff;">p If substitution was made, then prints the new pattern space.</div>
| |
| * <div style="color:#0000ff;">i match REGEXP in a case-insensitive manner.</div>
| |
| * <div style="color:#0000ff;">w file If substitution was made, write out the result to the given file.</div>
| |
| * <div style="color:#0000ff;">We can use different delimiters ( one of @ % ; : ) instead of /</div>
| |
| | |
| | |
| | |
| <div style="color:#0000ff;"></div>
| |
| | |
| <div style="color:#0000ff;">Let us first create thegeekstuff.txt file that will be used in all the examples mentioned below.</div>
| |
| | |
| <div style="color:#0000ff;">cat thegeekstuff.txt</div>
| |
| <div style="color:#0000ff;"><nowiki># Instruction Guides</nowiki></div>
| |
| <div style="color:#0000ff;">1. Linux Sysadmin, Linux Scripting etc.</div>
| |
| <div style="color:#0000ff;">2. Databases - Oracle, mySQL etc.</div>
| |
| <div style="color:#0000ff;">3. Security (Firewall, Network, Online Security etc)</div>
| |
| <div style="color:#0000ff;">4. Storage in Linux</div>
| |
| <div style="color:#0000ff;">5. Productivity (Too many technologies to explore, not much time available)</div>
| |
| <div style="color:#0000ff;"><nowiki># Additional FAQS</nowiki></div>
| |
| <div style="color:#0000ff;">6. Windows- Sysadmin, reboot etc.</div>
| |
| | |
| <div style="color:#0000ff;">Let us review some interesting examples for substitution now.</div>
| |
| | |
| ==== {{anchor|RefHeadingToc27621725578261}} Ersetzen von “Linux” durch “Unix” (s) ====
| |
| | |
| <div style="color:#0000ff;">In the example below, in the output line “1. Linux-Unix Sysadmin, Linux Scripting etc” only first Linux is replaced by Linux-Unix. If no flags are specified the first match of line is replaced.</div>
| |
| | |
| <div style="color:#0000ff;">sed 's/Linux/Unix/' thegeekstuff.txt</div>
| |
| <div style="color:#0000ff;"><nowiki># Instruction Guides</nowiki></div>
| |
| <div style="color:#0000ff;">1. Unix Sysadmin, Linux Scripting etc.</div>
| |
| <div style="color:#0000ff;">2. Databases - Oracle, mySQL etc.</div>
| |
| <div style="color:#0000ff;">3. Security (Firewall, Network, Online Security etc)</div>
| |
| <div style="color:#0000ff;">4. Storage in Unix</div>
| |
| <div style="color:#0000ff;">5. Productivity (Too many technologies to explore, not much time available)</div>
| |
| <div style="color:#0000ff;"><nowiki># Additional FAQS</nowiki></div>
| |
| <div style="color:#0000ff;">6. Windows- Sysadmin, reboot etc.</div>
| |
| | |
| ==== {{anchor|RefHeadingToc27641725578261}} Alle Treffer ersetzen (s//g) ====
| |
| | |
| <div style="color:#0000ff;">The below sed command replaces all occurrences of Linux to Linux-Unix using global substitution flag “g”.</div>
| |
| | |
| <div style="color:#0000ff;">sed 's/Linux/Linux-Unix/g' thegeekstuff.txt</div>
| |
| <div style="color:#0000ff;"><nowiki># Instruction Guides</nowiki></div>
| |
| <div style="color:#0000ff;">1. Linux-Unix Sysadmin, Linux-Unix Scripting etc.</div>
| |
| <div style="color:#0000ff;">2. Databases - Oracle, mySQL etc.</div>
| |
| <div style="color:#0000ff;">3. Security (Firewall, Network, Online Security etc)</div>
| |
| <div style="color:#0000ff;">4. Storage in Linux-Unix</div>
| |
| <div style="color:#0000ff;">5. Productivity (Too many technologies to explore, not much time available)</div>
| |
| <div style="color:#0000ff;"><nowiki># Additional FAQS</nowiki></div>
| |
| <div style="color:#0000ff;">6. Windows- Sysadmin, reboot etc.</div>
| |
| | |
| ==== {{anchor|RefHeadingToc27661725578261}} Jeden zweiten Treffer ersetzen (s//2) ====
| |
| | |
| <div style="color:#0000ff;">In the example below, in the output line “1. Linux Sysadmin, Linux-Unix Scripting etc.” only 2nd occurance of Linux is replaced by Linux-Unix.</div>
| |
| | |
| <div style="color:#0000ff;">sed 's/Linux/Linux-Unix/2' thegeekstuff.txt</div>
| |
| <div style="color:#0000ff;"><nowiki># Instruction Guides</nowiki></div>
| |
| <div style="color:#0000ff;">1. Linux Sysadmin, Linux-Unix Scripting etc.</div>
| |
| <div style="color:#0000ff;">2. Databases - Oracle, mySQL etc.</div>
| |
| <div style="color:#0000ff;">3. Security (Firewall, Network, Online Security etc)</div>
| |
| <div style="color:#0000ff;">4. Storage in Linux</div>
| |
| <div style="color:#0000ff;">5. Productivity (Too many technologies to explore, not much time available)</div>
| |
| <div style="color:#0000ff;"><nowiki># Additional FAQS</nowiki></div>
| |
| <div style="color:#0000ff;">6. Windows- Sysadmin, reboot etc.</div>
| |
| | |
| ==== {{anchor|RefHeadingToc27701725578261}} Nur ersetzen, wenn eine Zeile einen Treffer ergibt ====
| |
| | |
| <div style="color:#0000ff;">In this example, if the line matches with the pattern “-”, then it replaces all the characters from “-” with the empty.</div>
| |
| | |
| <div style="color:#0000ff;">sed '/\-/s/\-.*//g' thegeekstuff.txt</div>
| |
| <div style="color:#0000ff;"><nowiki># Instruction Guides</nowiki></div>
| |
| <div style="color:#0000ff;">1. Linux Sysadmin, Linux Scripting etc.</div>
| |
| <div style="color:#0000ff;">2. Databases</div>
| |
| | |
| <div style="color:#0000ff;">3.</div>
| |
| <div style="color:#0000ff;">4.</div>
| |
| <div style="color:#0000ff;">5.</div>
| |
| <div style="color:#0000ff;"><nowiki>#</nowiki></div>
| |
| <div style="color:#0000ff;">6.</div>
| |
| | |
| <div style="color:#0000ff;">Security (Firewall, Network, Online Security etc)</div>
| |
| <div style="color:#0000ff;">Storage in Linux</div>
| |
| <div style="color:#0000ff;">Productivity (Too many technologies to explore, not much time available)</div>
| |
| <div style="color:#0000ff;">Additional FAQS</div>
| |
| <div style="color:#0000ff;">Windows</div>
| |
| | |
| ==== {{anchor|RefHeadingToc27721725578261}} Letzten X Zeichen jeder Zeile löschen ====
| |
| | |
| <div style="color:#0000ff;">This sed example deletes last 3 characters from each line.</div>
| |
| | |
| <div style="color:#0000ff;">sed 's/...$//' thegeekstuff.txt</div>
| |
| <div style="color:#0000ff;"><nowiki># Instruction Gui</nowiki></div>
| |
| <div style="color:#0000ff;">1. Linux Sysadmin, Linux Scripting e</div>
| |
| <div style="color:#0000ff;">2. Databases - Oracle, mySQL e</div>
| |
| <div style="color:#0000ff;">3. Security (Firewall, Network, Online Security e</div>
| |
| <div style="color:#0000ff;">4. Storage in Li</div>
| |
| <div style="color:#0000ff;">5. Productivity (Too many technologies to explore, not much time availab</div>
| |
| <div style="color:#0000ff;"><nowiki># Additional F</nowiki></div>
| |
| <div style="color:#0000ff;">6. Windows- Sysadmin, reboot e</div>
| |
| | |
| ==== {{anchor|RefHeadingToc27741725578261}} Kommentare löschen ====
| |
| | |
| <div style="color:#0000ff;">Delete all the comment lines from a file as shown below using sed command.</div>
| |
| | |
| <span style="color:#0000ff;">'''sed -e 's/#.*//' thegeekstuff.txt'''</span>
| |
| <div style="color:#0000ff;">1. Linux Sysadmin, Linux Scripting etc.</div>
| |
| <div style="color:#0000ff;">2. Databases - Oracle, mySQL etc.</div>
| |
| <div style="color:#0000ff;">3. Security (Firewall, Network, Online Security etc)</div>
| |
| <div style="color:#0000ff;">4. Storage in Linux</div>
| |
| <div style="color:#0000ff;">5. Productivity (Too many technologies to explore, not much time available)</div>
| |
| <div style="color:#0000ff;">6. Windows- Sysadmin, reboot etc.</div>
| |
| | |
| ==== {{anchor|RefHeadingToc27761725578261}} Kommentare und leere Zeilen löschen ====
| |
| | |
| <div style="color:#0000ff;">In this example, there are two commands seperated by ‘;’</div>
| |
| | |
| <div style="color:#0000ff;">First command replaces the lines starting with the # to the blank lines</div>
| |
| | |
| <div style="color:#0000ff;">Second command deletes the empty lines.</div>
| |
| | |
| <span style="color:#0000ff;">'''sed -e 's/#.*//;/^$/d' thegeekstuff.txt'''</span>
| |
| <div style="color:#0000ff;">1. Linux Sysadmin, Linux Scripting etc.</div>
| |
| <div style="color:#0000ff;">2. Databases - Oracle, mySQL etc.</div>
| |
| <div style="color:#0000ff;">3. Security (Firewall, Network, Online Security etc)</div>
| |
| <div style="color:#0000ff;">4. Storage in Linux</div>
| |
| <div style="color:#0000ff;">5. Productivity (Too many technologies to explore, not much time available)</div>
| |
| <div style="color:#0000ff;">6. Windows- Sysadmin, reboot etc.</div>
| |
| | |
| ==== {{anchor|RefHeadingToc27781725578261}} Zeilenwechsel konvertieren ====
| |
| | |
| ===== DOS newlines (CR/LF) ins Unix-Format ändern =====
| |
| | |
| <div style="color:#0000ff;">Copy the DOS file to Unix, you could find \r\n in the end of each line.</div>
| |
| | |
| <div style="color:#0000ff;">This example converts the DOS file format to Unix file format using sed command.</div>
| |
| | |
| <span style="color:#0000ff;">'''$sed 's/.$//' filename'''</span>
| |
| | |
| ==== {{anchor|RefHeading2661739995267}} Rekursives Suchen und Ersetzen ====
| |
| | |
| Ersetzen einer Zeichenkette in allen Daten einer Verzeichnisstruktur.
| |
| | |
| '''find . -type f -print0 | xargs -0 -n 1 sed -i -e "s/suche/ersetze/g"'''
| |
| | |
| ===== Beispiel mit escape Zeichen \ =====
| |
| | |
| ''‘typo3temp/pics''' ersetzen mit ''‘../../typo3temp/pics'''
| |
| | |
| '''find . -name *.html -type f -print0 | xargs -0 -n 1 sed -i -e \ "s/’temp\/pics/’..\/..\/temp\/pics/g"'''
| |
| | |
| ==== {{anchor|RefHeadingToc27801725578261}} HTML Tags aus Datei entfernen ====
| |
| | |
| In this example, the regular expression given in the sed command matches the html tags and replaces with the empty.
| |
| | |
| '''sed -e 's/<[^>]*>//g''''
| |
| This <b> is </b> an <i>example</i>.
| |
| This is an example.
| |
| | |
| == {{anchor|RefHeading3008241082722535}} Mehrere Kommandos [-e] ==
| |
| | |
| Das Problem mit Kommandos wie »s« ist, dass sie keine Adressierung zulassen.
| |
| | |
| Sicher gibt es Situationen, wo nur ein Teil einer Datei zu bearbeiten ist.
| |
| | |
| Hier hilft das e-Kommando, mit dem sich beliebig viele Kommandos kombinieren lassen:
| |
| | |
| '''sed -e '3,$d' -e 's# #.#g' test.txt'''
| |
| .1 Der.Aufruf.des.Stream.Editors.besitzt.immer.das.Format:
| |
| .2 * Zuerst werden alle Zeilen ab der 3. Zeile entfernt
| |
| * anschließend die Leerzeichen durch Punkte ersetzt<br/>
| |
| | |
| | |
| '''Die Reihenfolge der Kommandos kann das Ergebnis beeinflussen'''
| |
| | |
| Eine alternative Angabe ist die Gruppierung mehrerer Kommandos.
| |
| | |
| Hierzu werden diese in geschweifte Klammern gesetzt und ein Semikolon nach jedem Kommando eingefügt
| |
| | |
| '''sed '{s/ /./g;3,$d}' test.txt'''
| |
| .1 Der.Aufruf.des.Stream.Editors.besitzt.immer.das.Format:
| |
| .2
| |
| | |
| ==== {{anchor|RefHeading25593109232536}} Verkettung von sed-Anweisungen ====
| |
| | |
| sed-Anweisungen lassen sich entweder mit Hilfe der Option "-e" aneinanderreihen oder mittels Pipe.
| |
| | |
| Die Aneinanderreihung mittels Pipe macht dann Sinn, wenn die Auswahlmenge schrittweise reduziert werden soll, analog zum Aneinanderpipen von grep-Kommandos.
| |
| | |
| ===== Beispiel =====
| |
| | |
| In der Datei httpd.conf sollen nur die Zeilen ausgegeben werden, die nicht mit "#" beginnen. Sodann soll "Allow" durch "Deny" ersetzt werden. Zunächst werden Zeilen selektiert, die nicht mit "#" beginnen. Die Ausgabe wird sodann mittels Pipe an einen weiteren sed-Prozess zu übergeben, der die Wortersetzung durchführt.
| |
| | |
| cat httpd.conf | sed -n '/^[^#]/p' | sed 's/Allow/Deny/'
| |
| # Reduktion der Auswahlmenge
| |
| # Ersetzung
| |
| | |
| | |
| | |
| Eine andere Möglichkeit besteht darin, mehrere Anweisungen an sed zu übergeben, die sukzessive abgearbeitet werden. Dies kann z.B. dann verwendet werden, wenn innerhalb einer Datei mehrere "Suchen & Ersetzen"-Befehle nacheinander durchgeführt werden sollen.
| |
| | |
| Nach jedem s-Befehl werden sämtliche Zeilen ausgegeben, sodass beim folgenden s-Befehl wieder die gesamte Datei zur Verfügung steht.
| |
| | |
| ===== Beispiel =====
| |
| | |
| in der Datei httpd.conf soll "Allow" durch "Deny" ersetzt werden und "localhost" durch "myserver"
| |
| | |
| cat httpd.conf | sed -e 's/Allow/Deny/g' -e 's/localhost/myserver/g'
| |
| # Ersetzung1
| |
| # Ersetzung2
| |
| | |
| | |
| | |
| Statt mehrere Anweisung mittels "-e" aneinanderzureihen, kann man diese auch durch ";" verketten, wobei das einfache Hochkomma nur am Anfang und am Ende stehen darf.
| |
| | |
| Die Option "-e" kann hierbei weggelassen werden.
| |
| | |
| cat httpd.conf | sed 's/Allow/Deny/g; s/localhost/myserver/g'
| |
| * analog zur vorigen Anweisung
| |
| | |
| | |
| | |
| == {{anchor|RefHeading3008261082722535}} Einfügen [i|a] ==
| |
| | |
| Der einzufügende Text muss auf einer neuen Zeile stehen, wobei jede Zeile bis auf die letzte durch einen Backslash abzuschließen ist. * »i« (insert) fügt den Text '''vor '''der betreffenden Zeile ein
| |
| * »a« (append) schreibt den neuen Text '''nach '''der Zeile.
| |
| | |
| | |
| | |
| ==== Beispiel ====
| |
| | |
| '''sed '8i\
| |
| <nowiki>===========================================\</nowiki>
| |
| Angabe Bereich von Zeilen\
| |
| <nowiki>===========================================' test.txt</nowiki>'''
| |
| 1 Der Aufruf des Stream Editors besitzt immer das Format:
| |
| 2
| |
| 3 sed 'Kommando' Dateiname
| |
| 4
| |
| 5 Dabei kann dem Kommando mitgeteilt werden, welche Zeilen der
| |
| 6 Eingabedatei es bearbeiten soll. Als Adressierung kommen folgende
| |
| 7 Mechanismen in Frage:
| |
| <nowiki>===========================================</nowiki>
| |
| Angabe Bereich von Zeilen
| |
| <nowiki>===========================================</nowiki>
| |
| 8
| |
| 9 Keine Angabe Alle Zeilen
| |
| 10 Nummer Genau diese Zeile
| |
| 11 Start, Ende Alle Zeilen von "Start" bis "Ende"
| |
| 12 $ Symbolisiert die letzte Zeile
| |
| 13 RegEx Zeilen, die den Regulären Ausdruck enthalten
| |
| 14 1, RegEx Von Zeile 1 bis zur ersten Zeile, die RegEx enthält
| |
| | |
| == {{anchor|RefHeading3008281082722535}} Einfügen aus einer Datei [r] ==
| |
| | |
| In seltenen Fällen wird ein Text nur in eine einzige Datei eingefügt werden, sonst wäre der Griff zu einem herkömmlichen Editors der effizientere Weg.
| |
| | |
| Eine Methode ist, den einzusetzenden Text in einer separaten Datei zu erfassen und Sed jene unterzuschieben.
| |
| | |
| '''cat ins.txt'''
| |
| <nowiki>===========================================</nowiki>
| |
| Angabe Bereich von Zeilen
| |
| <nowiki>===========================================</nowiki>
| |
| Dieser Text lässt sich mittels des r-Kommandos einfach an beliebiger Stelle einordnen:
| |
| '''sed '8r ins.txt' test.txt'''
| |
| 1 Der Aufruf des Stream Editors besitzt immer das Format:
| |
| 2
| |
| 3 sed 'Kommando' Dateiname
| |
| 4
| |
| 5 Dabei kann dem Kommando mitgeteilt werden, welche Zeilen der
| |
| 6 Eingabedatei es bearbeiten soll. Als Adressierung kommen folgende
| |
| 7 Mechanismen in Frage:
| |
| 8
| |
| <nowiki>===========================================</nowiki>
| |
| Angabe Bereich von Zeilen
| |
| <nowiki>===========================================</nowiki>
| |
| 9 Keine Angabe Alle Zeilen
| |
| 10 Nummer Genau diese Zeile
| |
| 11 Start, Ende Alle Zeilen von "Start" bis "Ende"
| |
| 12 $ Symbolisiert die letzte Zeile
| |
| 13 RegEx Zeilen, die den Regulären Ausdruck enthalten
| |
| 14 1, RegEx Von Zeile 1 bis zur ersten Zeile, die RegEx enthält
| |
| | |
| == {{anchor|RefHeading3008301082722535}} Schreiben in eine Datei [w] ==
| |
| | |
| Das Ergebnis des Stream Editors lässt sich in einer Datei speichern:
| |
| | |
| '''sed -n '/^1/w out.txt' test.txt'''
| |
| '''cat out.txt'''
| |
| 10 Nummer Genau diese Zeile
| |
| 11 Start, Ende Alle Zeilen von "Start" bis "Ende"
| |
| 12 $ Symbolisiert die letzte Zeile
| |
| 13 RegEx Zeilen, die den Regulären Ausdruck enthalten
| |
| 14 1, RegEx Von Zeile 1 bis zur ersten Zeile, die RegEx enthält
| |
| | |
| ==== Änderungen in Datei schreiben und auf Konsole (s//gpw) ====
| |
| | |
| The example below has substitution with three flags. It substitutes all the occurance of Linux to Linux-Unix and prints the substituted output as well as written the same to the given the file.
| |
| | |
| sed -n 's/Linux/Linux-Unix/gpw output' thegeekstuff.txt
| |
| 1. Linux-Unix Sysadmin, Linux-Unix Scripting etc.
| |
| 4. Storage in Linux-Unix
| |
| | |
| | |
| cat output
| |
| 1. Linux-Unix Sysadmin, Linux-Unix Scripting etc.
| |
| 4. Storage in Linux-Unix
| |
| | |
| == {{anchor|RefHeading3008421082722535}} Dateien direkt bearbeiten ==
| |
| | |
| Häufig ist es sinnvoll Dateien direkt zu bearbeiten, anstatt sie auf die Standardausgabe zu schreiben.
| |
| | |
| Dies ist mit der Option »-i« möglich.
| |
| | |
| Der folgende Befehl ersetzt alle "Hallo" in der Datei test.txt durch "Hey", ohne eine Ausgabe zu erzeugen.
| |
| | |
| '''sed -i"" 's|Hallo|Hey|g' test.txt'''
| |
| | |
| Achtung! Das "" nach -i ist notwendig.
| |
| | |
| Mit dieser Option ist es auch sehr einfach möglich mehrere Dateien zu bearbeiten.
| |
| | |
| Hiermit werden alle Dateien im aktuellen Ordner die mit .txt enden wie gerade beschrieben bearbeitet:
| |
| | |
| '''sed -i"" 's|Hallo|Hey|g' *.txt'''
| |
| | |
| == {{anchor|RefHeading31741781900648}} Dateien ergänzen ==
| |
| | |
| === {{anchor|RefHeading2660539995267}} Zeile am Dateianfang einfügen ===
| |
| | |
| Dies ist auch ohne sed möglich, z.B. mit Hilfe von echo und cat
| |
| | |
| cat - <<< "Anfang" sed-test.txt > sed-test2.txt
| |
| echo "Anfang" | cat - sed-test.txt > sed-test2.txt
| |
| echo "Anfang" > sed-test2.txt; cat sed-test.txt >> sed-test2.txt
| |
| | |
| | |
| Mit Hilfe von sed geht dies eleganter.
| |
| | |
| sed '1iAnfang' < sed-test.txt > sed-test2.txt
| |
| * 1=Zeile 1 (explizite Bereichsauswahl)
| |
| * i=insert-Befehl
| |
| | |
| | |
| | |
| === {{anchor|RefHeading2660739995267}} Zeile innerhalb des Textes einfügen ===
| |
| | |
| Die folgende Anweisung fügt eine neue Zeile vor der vorletzten Zeile ein.
| |
| | |
| sed '/vorletzte/idies ist die vorvorletzte Zeile' < sed-test.txt > sed-test2.txt
| |
| * /vorletzte/ = Bereichsauswahl über RE
| |
| * i=insert-Befehl
| |
| | |
| | |
| | |
| === {{anchor|RefHeading2660939995267}} Zeile ans Dateiende anhängen ===
| |
| | |
| sed '$aEnde' < sed-test.txt > sed-test2.txt
| |
| * $=letzte Zeile (explizite Bereichsauswahl)
| |
| * a=append-Befehl
| |
| | |
| | |
| | |
| === {{anchor|RefHeading2661139995267}} Zeichen am Zeilenanfang einfügen ===
| |
| | |
| Das Zeichen "#" soll in allen Zeilen an den Zeilenanfang gesetzt werden.
| |
| | |
| sed 's/^/#/' < sed-test.txt
| |
| * s <nowiki>=suchen & ersetzen</nowiki>
| |
| * /^/ <nowiki>="Zeilenanfangszeichen"</nowiki>
| |
| * /#/ <nowiki>= Replace-String</nowiki>
| |
| | |
| | |
| | |
| Die Anweisung erscheint auf den ersten Blick nicht ganz logisch. Sie ist folgendermaßen zu interpretieren: Ersetze in jeder Zeile das am Zeilenanfang gedachte fiktive "leer-Zeichen" (sozusagen "") durch das #-Zeichen.
| |
| | |
| Es wird also nicht der Zeilenanfang selbst ersetzt, was ja gar nicht möglich wäre, da es kein Zeilenanfangszeichen analog zum Zeilenendezeichen gibt. Einfacher verständlich wird die Anweisung, wenn man ein bestimmtes Wort am Zeilenanfang ersetzen lässt:
| |
| | |
| sed 's/^Hier/Dort/' < sed-test.txt
| |
| * Hier" am Zeilenanfang wird ersetzt durch "Dort"
| |
| | |
| | |
| | |
| ===== Beispiel =====
| |
| | |
| Das Zeichen "#" soll bei Zeilen, die mit "Hier" beginnen an den Zeilenanfang gesetzt werden.
| |
| | |
| sed 's/^Hier/#Hier/' < sed-test.txt
| |
| | |
| ===== Beispiel =====
| |
| | |
| Das Zeichen "#" soll in Zeilen, in denen "letzt" vorkommt, an den Zeilenanfang gesetzt werden. Dieser Fall unterscheidet sich von den vorigen, weil das "suchen & ersetzen" auf einen bestimmten Bereich beschränkt werden muss. Hierzu werden geschweifte Klammern verwendet.
| |
| | |
| sed '/letzt/{s/^/#/}' < sed-test.txt
| |
| * /letzt/ <nowiki>=RE; Zeilen, in denen "letzt" vorkommt, werden selektiert</nowiki>
| |
| * {s...} <nowiki>= "suchen & ersetzen" wird nur in den selektierten Zeilen ausgeführt</nowiki>
| |
| | |
| | |
| | |
| == {{anchor|RefHeading3008321082722535}} Nächste Zeile beabeiten[n] ==
| |
| | |
| Soll erst die dem Suchmuster folgende Zeile manipuliert werden, ist das n-Kommando der beste Kandidat:
| |
| | |
| '''sed -n '8,${n;s/\(.\{1,\}\)/*\1/p;}' test.txt'''
| |
| <nowiki>* 9 </nowiki> Keine Angabe Alle Zeilen
| |
| <nowiki>*11 </nowiki> $ Symbolisiert die letzte Zeile
| |
| <nowiki>*13 </nowiki> RegEx Zeilen, die den Regulären Ausdruck enthalten
| |
| | |
| Die Kommandozeile ist schwer verdaulich... aber der Reihe nach:
| |
| | |
| | |
| {| style="border-spacing:0;width:17.507cm;"
| |
| |- | | |- |
| ! style="border-top:0.05pt solid #000000;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding:0.097cm;" | »-n«
| | |colspan="2"| |
| ! style="border:0.05pt solid #000000;padding:0.097cm;" | als Kommandozeilenoption besagt, dass die Ausgabe einzig die bearbeiteten Zeilen betreffen soll.
| | sed 's/alt/NEU/' inputfile |
| |- | | |- |
| | style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding:0.097cm;" | '''Da jedoch das Flag »s« '''
| | |'''Input''' |
| | style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding:0.097cm;" | sämtliche Ausgaben »verschluckt«, muss »p« am Ende bemüht werden. | | |'''Output''' |
| |- | | |- |
| | style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding:0.097cm;" | '''»8,$« ''' | | | |
| | style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding:0.097cm;" | adressiert die Zeilen 8 bis zum Ende der Datei. Die erste Zeile, die also gefunden wurde, ist die 8. | | alt |
| | 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 alt |
| | |} |
| | |
| | Dieses Verhalten kann allerdings durch die Angabe von Kommandoptionen geändert werden: Wird eine Zahl N angegeben, dann wird lediglich das ''N''-te Vorkommen geändert, ein <code>g</code> (für ''global'') ändert alle Vorkommen: |
| | |
| | {| style="margin-left:2em" |
| |- | | |- |
| | style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding:0.097cm;" | '''»n« ''' | | |colspan="2"| |
| | style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding:0.097cm;" | als Substitutionskommando bewirkt, dass die nächste Zeile bearbeitet wird - Zeile 9. Diese 9. Zeile wird nun substituiert.
| | sed 's/alt/NEU/'''g'''' inputfile |
| |- | | |- |
| | style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding:0.097cm;" | '''».\{1,\}« '''
| | |'''Input''' |
| | style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding:0.097cm;" | meint »mindestens ein (\{1,\}) beliebiges (.) Zeichen. | | |'''Output''' |
| |-
| |
| | style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding:0.097cm;" |
| |
| | style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding:0.097cm;" | Da jede Zeile im Beispiel zumindest die Zeilenummer umfasst und das komplette Muster mit »\(...\)« gespeichert wird, erscheint die gesamte Zeile mit vorangestelltem Stern (*\1) in der Ausgabe...
| |
| |-
| |
| | style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding:0.097cm;" |
| |
| | style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding:0.097cm;" | Sed fährt mit der folgenden Zeile (10) fort, die (wegen Flag »n«) übersprungen wird.
| |
| | |
| | |
| |- | | |- |
| | | |
| | alt |
| | 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 NEU |
| |} | | |} |
| == {{anchor|RefHeading3008341082722535}} Zeichen tauschen [y] ==
| |
|
| |
| Einzelne Zeichen lassen sich durch andere einzelne Zeichen ersetzen.
| |
|
| |
| Das Zeichen an Position x der Liste zu ersetzender Zeichen wird in das Zeichen an Position x der Liste der neuen Zeichen transformatiert.
| |
|
| |
| Damit ist klar, dass beide Zeichenlisten dieselbe Länge besitzen müssen:
| |
|
| |
| '''sed 'y/abcdefghijklmnopqrstuvwxyz/zyxwvutsrqponmlkjihgfedcba/' test.txt'''
| |
| 1 Dvi Afuifu wvh Sgivzn Ewrglih yvhrgag rnnvi wzh Flinzg:
| |
| 2
| |
| 3 hvw 'Klnnzmwl' Dzgvrmznv
| |
| 4
| |
| 5 Dzyvr pzmm wvn Klnnzmwl nrgtvgvrog dviwvm, dvoxsv Zvrovm wvi
| |
| 6 Ermtzyvwzgvr vh yvziyvrgvm hloo. Aoh Awivhhrvifmt plnnvm ulotvmwv
| |
| 7 Mvxszmrhnvm rm Fiztv:
| |
| 8
| |
| 9 Kvrmv Amtzyv Aoov Zvrovm
| |
| 10 Nfnnvi Gvmzf wrvhv Zvrov
| |
| 11 Sgzig, Emwv Aoov Zvrovm elm "Sgzig" yrh "Emwv"
| |
| 12 $ Sbnylorhrvig wrv ovgagv Zvrov
| |
| 13 RvtEc Zvrovm, wrv wvm Rvtfo/auml;ivm Afhwifxp vmgszogvm
| |
| 14 1, RvtEc Vlm Zvrov 1 yrh afi vihgvm Zvrov, wrv RvtEc vmgsäog
| |
|
| |
|
| == {{anchor|RefHeading3008361082722535}} Sed vorzeitig beenden [q] == | | ==== Filtern bestimmter Zeilen ==== |
| | Grundsätzlich gibt <code>sed</code> immer den Inhalt des Pattern Spaces nach der letzten Anweisung aus. Will man dieses Verhalten für einzelne Zeilen unterdrücken, so kann man entweder über eine Regel bestimmte Zeilen löschen (explizite Filterung), aber es ist auch mit der Kommandozeilen-Option <code>-n</code> möglich, dieses Verhalten insgesamt abzustellen (implizite Filterung). Ausgegeben wird dann nur noch, was mit dem ausdrücklichen <code>Print</code>-Kommando (<code>p</code>) angegeben wird. <code>p</code> kann dabei entweder als eigene Anweisung oder als Option für andere Anweisungen dienen. Das Beispiel gibt aus dem bereits oben verwendeten Text nur noch die „Kapitelüberschriften“ aus: |
|
| |
|
| Manchmal ist es sinnvoll, den Stream Editor vorzeitig zu beenden:
| | {| style="margin-left:2em" |
| | |
| '''sed '3q' test.txt'''
| |
| 1 Der Aufruf des Stream Editors besitzt immer das Format:
| |
| 2
| |
| 3 sed 'Kommando' Dateiname
| |
| '''sed -n '/sed/{p;q;}' test.txt'''
| |
| 3 sed 'Kommando' Dateiname
| |
| | |
| == {{anchor|RefHeading3008381082722535}} Zeilentausch [h|g|G|x ] ==
| |
| | |
| Die aktuell bearbeitete Zeile hält der Sed in einem Zwischenspeicher und bearbeitet sie in diesem »Pattern Space«.
| |
| | |
| Hat der Editor seine Arbeit beendet, gibt er die Zeile aus und lädt die folgende Zeile der Eingabedatei in den Zwischenspeicher.
| |
| | |
| | |
| {| style="border-spacing:0;margin:auto;width:17.501cm;" | |
| |-
| |
| ! align=center style="border-top:0.05pt solid #000000;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding:0.097cm;" | h
| |
| ! style="border:0.05pt solid #000000;padding:0.097cm;" | Mit dem Kommando »h« kann der aktuelle Zwischenspeicher in einen Puffer gesichert werden (»holding buffer«).
| |
| |-
| |
| | align=center style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding:0.097cm;" | '''G'''
| |
| | style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding:0.097cm;" | Das Kommando »G« fügt den Inhalt dieses Sicherungspuffers '''hinter '''der aktuell bearbeiteten Zeile ein.
| |
| |- | | |- |
| | align=center style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding:0.097cm;" | '''g''' | | |colspan="2"| |
| | style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding:0.097cm;" | »g« '''ersetzt '''die aktuelle Zeile durch den Inhalt des Sicherungspuffers.
| | sed -n 's/^=\(.*\)$/Kapitelüberschrift: \1/p' inputfile |
| |- | | |- |
| | align=center style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding:0.097cm;" | '''x'''
| | |'''Input''' |
| | style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding:0.097cm;" | Den Inhalt der beiden Puffer '''vertauscht '''das Kommando »x«. | | |'''Output''' |
| |- | | |- |
| | | |
| | =Kapitel1 |
| | Zeile 1 |
| | Zeile 2 |
| | Zeile 3 |
| | =Kapitel2 |
| | Zeile A |
| | Zeile B |
| | Zeile C |
| | | |
| | Kapitelüberschrift: Kapitel1 |
| | Kapitelüberschrift: Kapitel2 |
| |} | | |} |
|
| |
|
| | ==== Debugging ==== |
| | Zur Fehlersuche kann es nützlich sein, sich Zwischenergebnisse ausgeben zu lassen um die Entwicklung im Pattern Space besser nachvollziehen zu können. Dazu kann die bereits oben erwähnte Option <code>p</code> verwendet werden. Zeilen können durchaus mehrmals hintereinander ausgegeben werden. In dem obigen Beispielprogramm etwa: |
|
| |
|
| ==== Beispiel 1 ==== | | {| style="margin-left:2em" |
| | | |- |
| '''sed -e '/sed/{h;d;}' -e '4G' -e '4q' test.txt'''
| | |colspan="2"| |
| 1 Der Aufruf des Stream Editors besitzt immer das Format:
| | sed '/^=/ { |
| 2
| | s/^=//'''p''' |
| 4 | | s/^/ (/'''p''' |
| 3 sed 'Kommando' Dateiname
| | s/$/)/'''p''' |
| '''sed -e '/sed/{h;d;}' -e '4g' -e '5q' test.txt'''
| | h |
| 1 Der Aufruf des Stream Editors besitzt immer das Format:
| | d |
| 2
| | } |
| 3 sed 'Kommando' Dateiname
| | '''p''' |
| 5 Dabei kann dem Kommando mitgeteilt werden, welche Zeilen der
| | G' inputfile |
| | | |} |
| ===== Erklärung =====
| |
| | |
| * Das erste Kommando »-e '/sed/{h;d;}'« in teilt dem Editor mit, die Zeile, die sed enthält, zuerst in den Zwischenspeicher zu sichern und nachfolgend zu löschen.
| |
| * Das zweite Kommando vollzieht das Einfügen des Inhalts des Puffers. »-e '4G'« fügt nach der 4.Zeile ein (Achtung: die gelöschte Zeile wird mitgezählt!)»-e '4g'« ersetzt die 4.Zeile.
| |
| * Das letzte Kommando »-e '4q'« beendet die Arbeit des Editors nach der 4. Zeile.
| |
| | |
| | |
| | |
| ==== Beispiel 2 ====
| |
| | |
| '''sed -e '/Aufruf/h' -e '/Angabe/x' -e '$G' test.txt'''
| |
| 1 Der Aufruf des Stream Editors besitzt immer das Format:
| |
| 2
| |
| 3 sed 'Kommando' Dateiname
| |
| 4
| |
| 5 Dabei kann dem Kommando mitgeteilt werden, welche Zeilen der
| |
| 6 Eingabedatei es bearbeiten soll. Als Adressierung kommen folgende
| |
| 7 Mechanismen in Frage:
| |
| 8
| |
| 1 Der Aufruf des Stream Editors besitzt immer das Format:
| |
| 10 Nummer Genau diese Zeile
| |
| 11 Start, Ende Alle Zeilen von "Start" bis "Ende"
| |
| 12 $ Symbolisiert die letzte Zeile
| |
| 13 RegEx Zeilen, die den Regulären Ausdruck enthalten
| |
| 14 1, RegEx Von Zeile 1 bis zur ersten Zeile, die RegEx enthält
| |
| 9 Keine Angabe Alle Zeilen
| |
| | |
| ===== Erklärung =====
| |
| | |
| * Enthält eine Zeile das Muster »Aufruf«, wird sie im Zwischenpuffer abgelegt.
| |
| * Steht in einer Zeile »Angabe«, so wird diese Zeile mit dem Inhalt des Zwischenpuffers vertauscht.
| |
| * Der Inhalt des Zwischenpuffers wird hinter der letzten Zeile eingefügt.
| |
| | |
| | |
| | |
| == {{anchor|RefHeading3008481082722535}} Quellen ==
| |
| | |
| * Linuxfibel (de.linwiki.org/wiki/Linuxfibel_-_Unix-Werkzeuge_-_Sed)
| |
| * Dokumentation zu GNU sed (www.gnu.org/software/sed/manual/sed.html)
| |
| * The Geek Stuff (http://www.thegeekstuff.com/)
| |
| | |
| | |
| | |
| == {{anchor|RefHeading3008401082722535}} Sed-Skripte ==
| |
| | |
| Kompliziertere und häufig benötigte Sed-Aufrufe schreibt man besser in eine Datei. Der Aufruf von Sed sieht dann wie folgt aus:
| |
| | |
| sed -f <Skript_Datei> <zu_bearbeitende_Datei>
| |
| | |
| Beim Schreiben eines Skripts gelten folgende Regeln: * Beginnt eine Zeile mit einem Doppelkreuz #, so handelt es sich um einen Kommentar
| |
| * Vor und nach einem Kommando dürfen keine Leerzeichen, Tabulatoren... stehen
| |
| * Mehrere Kommandos auf einer Zeile, sind sie durch Semikola voneinander zu trennen
| |
| | |
| | |
| | |
| Der Stream Editor wird das gesamte Skript auf jede Zeile der Eingabedatei anwenden.
| |
| | |
| Als Beispiel dient ein Skript, dass alle deutschen Umlaute in der Eingabedatei umschreibt.
| |
| | |
| '''cat umlaut''' | |
| <nowiki>## Ersetzen Umlaute</nowiki>
| |
| s/ä/\ae/g
| |
| s/ü/\ue/g
| |
| s/ö/\oe/g
| |
| s/Ä/\ae/g
| |
| s/Ü/\Ue/g
| |
| s/Ö/\Oe/g
| |
| s/ß/\ss/g
| |
| | |
| Das Anwendungsbeispiel demonstriert die Möglichkeit der Kopplung von Kommandozeilenbefehlen und einem Skript:
| |
|
| |
|
| '''sed -e '1,12d' -f umlaut test.txt'''
| | [[Kategorie:Sed]] |
| 13 RegEx Zeilen, die den Regulären Ausdruck enthalten
| | [[Kategorie:Linux/Befehl]] |
| 14 1, RegEx Von Zeile 1 bis zur ersten Zeile, die RegEx enthält
| | {{DEFAULTSORT:sed}} |