|
Der Stream-Editor sed
sed liest aus der angegebenen Eingabedatei (normalerweise Standardeingabe) Zeile für
Zeile in seinen Eingabepuffer, führt die Edieranweisungen auf die Zeile aus und schreibt sie auf die Standardausgabe. sed beendet seine Arbeit, wenn das Ende der Eingabedatei erreicht ist oder explizit eine Beendigungsanweisung erreicht wurde. Ein zweiter Puffer, der Haltepuffer, dient zum Zwischenspeichern von Ergebnissen. Aufruf: sed [-n] [-e 'sed-Anweisungen'] [-f SKriptdatei] [eingabedatei(en)] Der sed ist ein nicht-interaktiver Editor zur Dateibearbeitung.Da der sed nicht interaktiv arbeitet, muß die Befehlsfolge zum Editieren
bereits beim Aufruf festliegen. Die angegebene Textdatei ist die Eingabedatei,
deren Inhalt durch die Editieranweisungen (Skript) modifiziert und dann auf die
Standardausgabe ausgegeben wird. Wird keine Eingabe-Datei angegeben,
liest sed seine Eingabe von der Standardeingabe. Mit der Option -f Skriptdatei
entnimmt der sed die Editieranweisungen der Skriptatei. Beachten Sie, daßdie
Eingabe-Datei selbst nicht verändert wird! Soll das Ergenis der sed-Anweisung in
einer (anderen) Datei gespeichert werden, dann mußdie Standardausgabe in diese
Datei umgelenkt werden. Optionen:
-n |
Die Standardausgabe wird unterdrückt (sinnvoll im Zusammenhang mit Pipes). |
-e |
Es werden die auf die Option -e folgenden Anweisungen
für die Bearbeitung der Eingabedatei verwendet. Bei mehr als
einer Anweisung müssen die Anweisungen durch Semikolon voneinander
getrennt werden. Das Semikolon mußdabei ohne Leerzeichen direkt hinter
der Anweisung stehen! Die -e Option kann mehrfach angegeben werden.
Um Fehlinterpretationen der Shell zu vermeiden, sollte die Editieranweisung
grundsätzlich in Hochkomma oder Gänsefüßchen eingeschlossen
werden. |
-f |
Wird diese Option angegeben, dann liest
sed seine Editieranweisungen aus der angegebenen Datei. Die Anweisungen
müssen entweder durch Semikolon getrennt werden oder jede Anweisung
muß in einer eigenen Zeile stehen. Leerzeichen hinter einer
Anweisung sind nicht erlaubt. Die Anweisungen dürfen nicht in Hochkommata
eingeschlossen werden. Durch mehrfache Angabe der -f Option können mehrere
Skriptdateien zugewiesen werden. |
sed kennt dieselben Anweisungen wie der interaktive Editor ed. Auch die Adressierung
(Zeilennummern, reguläre Ausdrücke) erfolgt auf die gleiche Weise.
Editieranweisungen haben die folgende Form:
[Adresse1 [,Adresse2 ] ] Funktion [Argumente]
Für jede Zeile der Eingabedatei werden alle Anweisungen ausgeführt.
Durch Angabe einer Zeile (Adresse1) oder eines Zeilenbereichs (Adresse1, Adresse2)
kann man deren Wirkung jedoch einschränken. Anstelle von Zeilennummern
können auch reguläre Ausdrücke verwendet werden:
[/Muster/] Funktion [Argumente]
[/Muster1/ [/Muster2/]] Funktion [Argumente]
Im ersten Fall wird jede Zeile, die die Zeichenkette Muster enthält,
von der Anweisung bearbeitet, im zweiten Fall alle Bereiche
der Eingabedatei, die mit einer Zeile, die Muster1 enthält, beginnen
und mit einer Zeile, die Muster2 enthält, enden.
Zusätzlich hat der sed noch weitere Funktionen (z.B.
Test- und Sprungfunktionen, Klammerung, Wiederholungen) und er eignet sich daher
besonders für Shell-Skripts. Interessant sind beim sed die Klammern:
- ( ) runde Klammern:
Die runden Klammern müssen mit \ geschützt werden. Sie legen die Gruppierung
der einzelnen Komponenten fest. Zum Beispiel:
AB*C deckt die Strings "AC", "ABC", ABBC" usw. ab.
\(AB\)*C deckt die Strings "C", "ABC", "ABABC" usw. ab.
- { } geschweifte Klammern
Die geschweiften Klammern müssen mit \ geschützt werden. Sie legen Wiederholungen
fest. Im folgenden stehen Z für ein Zeichen und M und N für Zahlen zwischen
0 und 253.
- genau M Wiederholungen: Z\{M\}
z.B. alle Namen mit genau 8 Zeichen Länge:
sed -n '/^.\{8\}/p' namen
- mindestens M Wiederholungen: Z\{M,\}
- zwischen N und M Wiederholungen: Z\{N,M\}
Die folgende Tabelle faßt die sed-Kommandos knapp zusammen.
a\ (append lines)
text
| text wird nach der aktuellen Eingabezeile auf die Standardausgabe geschrieben.
Besteht der text aus mehreren Zeilen, so muß das Fortsetzungszeichen \ am
Zeilenende vor RETURN angegeben werden. |
b [marke] (branch to label)
| Es wird zu der marke (in der Form :marke angegeben) des sed-Skripts gesprungen
und dort die Abarbeitung des Skripts fortgesetzt. Fehlt die Angabe der Marke,
so wird an das Skriptende gesprungen, was bewirkt, daß eine neue Eingabezeile
gelesen und das sed-Skript von Beginn an mit dieser neuen Eingabezeile wieder
ausgeführt wird. |
c \ (change lines)
text
| Der Inhalt des Eingabepuffers wird durch text ersetzt. Besteht text aus mehreren
Zeilen, so muß das Fortsetzungszeichen \ am Zeilenende vor RETURN angegeben
werden. |
d (delete lines)
| Der Inhalt des Eingabepuffers wird gelöscht (nicht ausgegeben), und das sed-Skript
wird sofort wieder von Beginn an mit dem Lesen einer neuen Eingabezeile gestartet. |
D (Delete lines part of pattern space)
| Der erste Teil des Eingabepuffers (bis zum ersten Zeilenende) wird gelöscht
(nicht ausgegeben), und das sed-Skript wird sofort wieder von Beginn an mit dem
restlichen Eingabepuffer gestartet. Pattern space ist der Eingabepuffer. |
g (get contents of hold area)
| Der Inhalt des Eingabepuffen wird durch den Inhalt des Haltepuffers (hold area)
Überschrieben. |
G (Get contents of hold area)
| Der Inhalt des Haltepuffers wird am Ende des Eingabepuffers (mit Newline-Zeichen
getrennt) angehängt. |
h (hold pattern space)
| Der Inhalt des Haltepuffers wird durch den Inhalt des Eingabepuffers
überschrieben. |
H (Hold pattern space)
| Der Inhalt des Eingabepuffers wird am Ende des Haltepuffers (mit Newline-Zeichen
getrennt) angehängt. |
i\ (insert lines)
text
| Der text wird vor der aktuellen Eingabezeile auf die Standardausgabe geschrieben.
Besteht der text aus mehreren Zeilen, muß das Fortsetzungszeichen \ am Zeilenende
vor RETURN angegeben werden. |
l (list pattern space on the standard output)
| Der Inhalt des Eingabepuffers wird auf die Standardausgabe geschrieben, wobei
nicht druckbare Zeichen durch ihren ASCII-Wert (2-Ziffer) ausgegeben werden. Überlange
Zeilen werden als mehrere einzelne Zeilen ausgegeben. |
n (next line)
| Der Eingabepuffer wird auf die Standardausgabe ausgegeben, dann wird die nächste
Eingabezeile in den Eingabepuffer gelesen. |
N (Next line)
| Die nächste Eingabezeile wird an den Eingabepuffer (mit Newline-Zeichen getrennt)
angehängt; die aktuelle Zeilennummer wird hierbei weitergezählt. |
p (print)
| Der Eingabepuffer wird auf die Standardausgabe ausgegeben. |
P (Print first part of the pattem space)
| Der erste Teil des Eingabepuffers (einschließlich des ersten Newline) wird
auf die Standardausgabe ausgegeben. |
q (quit)
| Nach Ausgabe des Eingabepuffers (nicht bei Option -n) wird zum Skriptende gesprungen
und die Skriptausführung beendet. |
r datei (read the contents of a file)
| Es wird die Datei datei gelesen und ihr Inhalt auf die Standardausgabe ausgegeben,
bevor die nächste Eingabezeile gelesen wird. Zwischen r und datei muß
genau ein Leerzeichen sein. |
s/regulärer Ausdruck/text/[flags] (substitute)
| Im Eingabepuffer werden die Textstücke, die durch den regulären Ausdruck
abgedeckt sind, durch den String text ersetzt. Anstelle des Trennzeichens / kann
jedes beliebige Zeichen verwendet werden.
Die flags legen fest, wie der Ersetzungsprozeß durchgeführt
werden soll.Es kann folgendes angegeben werden:
- n: Es wird nur das n-te Teilstück ersetzt; n muß zwischen 1 und 512
liegen.
- g (global): Es werden alle passenden Textstücke, die sich nicht überlappen,
ersetzt.
- p (print the pattem space if a replacement was made): Falls eine Ersetzung stattfand,
dann wird der veränderte Eingabepuffer ausgegeben.
- w datei (write the pattem space to a file if a replacement was made):
Falls eine Ersetzung stattfand, dann wird der veränderte Eingabepuffer
ans Ende der Datei datei geschrieben.
Fehlt die Angabe von flags, so wird nur das erste passende Textstück des
Eingabepuffers ersetzt. Es dürfen mehrere der vorgestellten flags-Angaben
gleichzeitig verwendet werden, wobei dann g (falls verwendet) an erster Stelle
stehen muß.
|
t [marke] (test substitutions):
| Falls seit dem letzten Lesen einer Eingabezeile
oder der Ausführung einer
t-Funktion eine Ersetzung stattfand, dann wird zu der marke (in der Form :marke
angegeben) des sed-Skripts gesprungen und dort die Abarbeitung des Skripts fortgesetzt;
im anderen Fall hat die Angabe dieser Funktion keine Auswirkung. Fehlt die Angabe
der Marke, so wird an das Ende des Skripts gesprungen. |
w datei (write to a file)
| Es wird der Eingabepuffer an das Ende der Datei datei geschrieben. Zwischen w
und datei muß genau ein Leerzeichen sein. |
x (exchange)
| Der Inhalt des Eingabepuffers wird mit dem Inhalt des Haltepuffers vertauscht. |
y/string1/string2/
| Im Eingabepuffer werden alle Zeichen, die in string1 vorkommen, durch die an
gleicher Stelle in string2 stehenden Zeichen ersetzt. string1 und string2 müssen
gleich lang sein. |
!funktion
| Die angegebene Funktion (oder Gruppe von Funktionen bei Klammerung mit {}) wird
nur für Zeilen ausgeführt, für die die angegebene Adreßangabe
nicht zutrifft. |
:marke
| Definiert eine Sprungmarke für die Funktionen b und t. |
"
| Schreibt die aktuelle Zeilennummer als eigene Zeile auf die Standardausgabe. |
{...}
| Klammert eine Gruppe von Funktionen, die nur ausgeführt werden, wenn der
Eingabepuffer gefüllt ist. |
#
| Dieses Zeichen leitet, wenn es als erstes Zeichen in einer Zeile angegeben wird,
mit einer Ausnahme einen Kommentar ein. Die Ausnahme ist, wenn direkt nach # das
Zeichen n angegeben wird; in diesem Fall wird die automatische Ausgabe, wie bei
der Kommandozeilen-Option -n, ausgeschaltet. Der Rest der Zeile nach #n wird ebenfalls
ignoriert. Eine Skript-Datei muß mindestens eine Nicht-Kommentarzeile enthalten.
Eine leere Funktion wird ignoriert. |
|
|
|