Sed/Mehrere Kommandos

Aus Foxwiki

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/'

  1. Reduktion der Auswahlmenge
  2. 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