Sed/Mehrere Kommandos: Unterschied zwischen den Versionen
Die Seite wurde neu angelegt: „Kategorie:Sed“ |
Keine Bearbeitungszusammenfassung |
||
Zeile 1: | Zeile 1: | ||
== 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 | |||
==== 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 | |||
[[Kategorie:Sed]] | [[Kategorie:Sed]] |
Aktuelle Version vom 31. März 2023, 10:47 Uhr
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