Dieses Kapitel ist für Stirb langsam sed-Programmierer (frei aus dem Englischen übersetzt) geschrieben.
Sprungziele (labels) werden durch einen Doppelpunkt, gefolgt vom Namen des Labels gekennzeichnet
':
', wobei label
label
ein beliebiger Name sein kann.
Einen unbedingten Sprung (es wird also immer gesprungen) kennzeichnet man mit
'b
' (b für branch).
Das Sprungziel label
label
muss natürlich irgendwo im Script definiert sein.
Wird kein Label angegeben, dann fängt unmittelbar der nächste Zyklus an.
Das Kommando 't
' definiert einen bedingten Sprung.
Gesprungen wird, wenn im aktuellen Zyklus eine erfolgreiche Substitution ('label
s///
'-Befehl)
durchgeführt werden konnte und außerdem seither kein 't
'-Sprung durchgeführt wurde.
Auch hier gilt, wenn das Sprungziel nicht angegeben wurde, beginnt ein neuer Zyklus.
Das sind alle Kommandos in diesem Zusammenhang. In diesem Sinne kann man sed als echten RISC-Editor bezeichnen (RISC = Reduced Instruction Set Computer).
Achtung bei der Verwendung von 't
', die manches Kopfzerbrechen bereiten kann.
Das Große Reformations-Script soll dies verdeutlichen.
#!/bin/sed -f s/foo/bar/g s/Bayern/Bayern/g;t noconversion s/Katholik/Protestant/g s/kathol/luther/g : noconversion # und weiter gehts im Code
Außer der Tatsache, dass man mit einem '/Bayern/!{...}
' besser bedient wäre,
sollte der Sinn des Scriptes klar sein: In jenen Zeilen, in denen das Wort 'Bayern' nicht vorkommt,
soll alles Katholische durch Protestantisches ersetzt werden.
Das eigentlich nutzlose 's/Bayern/Bayern/g
' stellt die Bedingung für den nachfolgenden Sprung dar.
Diese Zeile alleine? Nein, denn das Kommando 's/foo/bar/g
' kann genau so gut ausgeführt
werden und den 2 Zeilen entfernten Sprung einleiten.
Denn obwohl dies durch die eigenwillige Formatierung des Scriptes so aussieht, ist das 't
'-Kommando
nicht exklusiv an das unmittelbar davor stehende Kommando gebunden.
Um einen Seiteneffekt durch das 'foo-bar' Kommando zu vermeiden, sollte man es tunlichst irgendwo unterhalb des
Sprungkommandos unterbringen oder wenn das nicht möglich ist, dann muss ein
dummy-Sprung eingeführt werden.
#!/bin/sed -f s/foo/bar/g t dummy : dummy s/Bayern/Bayern/g;t noconversion s/Katholik/Protestant/g s/kathol/luther/g : noconversion # und weiter gehts im Code