Sed/Mehrere Kommandos
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
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
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 zum Beispiel 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