Zum Inhalt springen

Sed/Mehrere Kommandos: Unterschied zwischen den Versionen

Aus Foxwiki
Keine Bearbeitungszusammenfassung
K Textersetzung - „«“ durch „''“
Zeile 1: Zeile 1:
== Mehrere Kommandos [-e] ==
== Mehrere Kommandos [-e] ==
Das Problem mit Kommandos wie »s« ist, dass sie keine Adressierung zulassen.  
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.  
Sicher gibt es Situationen, wo nur ein Teil einer Datei zu bearbeiten ist.  

Version vom 31. März 2025, 12:20 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