Sed/Mehrere Kommandos: Unterschied zwischen den Versionen

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

  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