Sed: Unterschied zwischen den Versionen

Aus Foxwiki
Zeile 107: Zeile 107:


== Suchen und Ersetzen ==
== Suchen und Ersetzen ==
In diesem Falle steht das Trennzeichen "/" an drei Stellen: vor und hinter der RE, also dem Suchmuster und hinter dem Ersetzungsmuster.
[[Sed/Suchen und Ersetzen]]
 
Der mittlere Schrägstrich ist also Ende-Delimiter für die RE und gleichzeitig Anfangs-Delimiter für den Ersetzungsstring.
 
Logischer Weise müsste der Schrägstrich viermal vorkommen, aber sed hat die beiden mittleren Schrägstriche zu einem verschmolzen.
 
=== Zeichen ersetzen [s] ===
Das dem s-Kommando folgende Zeichen wird als Trennzeichen angesehen.
 
Anschließend folgt das Suchmuster und, getrennt durch das Trennzeichen, das Ersatzmuster, welches wiederum mittels des Trennzeichens abgeschlossen wird.
 
Prinzipiell kann jedes druckbare Zeichen als Trennzeichen Verwendung finden, es selbst darf allerdings kein Bestandteil eines Musters sein!
 
Eine Substitution sieht demnach wie folgt aus:
 
sed 's/altes Muster/neues Muster/' datei
sed 's?altes Muster?neues Muster?' datei
 
Im Beispiel ersetzen wir »RegEx« durch »Regulärer Ausdruck«:
 
sed 's#RegEx#Regulärer Ausdruck#' test.txt
  1 Der Aufruf des Stream Editors besitzt immer das Format:
  2
  3 sed 'Kommando' Dateiname
  4
  5 Dabei kann dem Kommando mitgeteilt werden, welche Zeilen der
  6 Eingabedatei es bearbeiten soll.
* Als Adressierung kommen folgende
  7 Mechanismen in Frage:
  8
  9 Keine Angabe Alle Zeilen
  10 Nummer Genau diese Zeile
  11 Start, Ende Alle Zeilen von "Start" bis "Ende" 12 $ Symbolisiert die letzte Zeile
  13 Regulärer Ausdruck Zeilen, die den Regulären Ausdruck enthalten
  14 1, Regulärer Ausdruck Von Zeile 1 bis zur ersten Zeile, die RegEx enthält
 
=== Globale Substitution ===
Wer genau hinschaut, wird im letzten Beispiel eine fehlende Ersetzung von »RegEx« bemerkt haben (Zeile 14).
* Der Editor bearbeitet in jeder Zeile nur das erste Vorkommen.
* Um alle Muster zu ersetzen, ist das Kommando »g« nachzustellen:
 
'''sed -n 's#RegEx#Regulärer Ausdruck#gp' test.txt'''
  13 Regulärer Ausdruck Zeilen, die den Regulären Ausdruck enthalten
  14 1, Regulärer Ausdruck Von Zeile 1 bis zur ersten Zeile, die Regulärer Ausdruck enthält
 
Da wir nur an den modifizierten Zeilen interessiert sind, haben wir das Sed mitgeteilt (Option -n).
 
Allerdings würde nun das Substitutionskommando die gesamte Ausgabe unterdrücken, hätten wir dem nicht mit dem p-Kommando entgegen gewirkt.
 
==== Speichern von Mustern und den späteren Zugriff darauf ====
Es soll die Numerierung der Zeilen von Einer- auf Zehnerschritte erhöht werden:
 
'''sed 's/^\([[:space:]]*[1-9]\{1,\}\)/\10/' test.txt'''
  10 Der Aufruf des Stream Editors besitzt immer das Format:
  20
  30 sed 'Kommando' Dateiname
  40
  50 Dabei kann dem Kommando mitgeteilt werden, welche Zeilen der
  60 Eingabedatei es bearbeiten soll.
* Als Adressierung kommen folgende
  70 Mechanismen in Frage:
  80
  90 Keine Angabe Alle Zeilen
  100 Nummer Genau diese Zeile
  110 Start, Ende Alle Zeilen von "Start" bis "Ende"
  120 $ Symbolisiert die letzte Zeile
  130 RegEx Zeilen, die den Regulären Ausdruck enthalten
  140 1, RegEx Von Zeile 1 bis zur ersten Zeile, die RegEx enthält* Das Beispiel profitiert von dem Wissen, dass die Zeilenummer am Beginn der Zeile zu finden ist.
* Das Muster, dem unser Interesse gilt, sind alle Ziffern zu Beginn der Zeile, wobei führende Leerzeichen durchaus möglich sind.
* Genau jenes Muster merken wir uns für den späteren Gebrauch vor, indem wir es in »\(...\)« einschließen.
* Der Zugriff auf dieses erste gespeicherte Muster im Ersatzmuster erfolgt durch »\1«. <br/>Bis zu 9 Muster lassen sich pro Zeile speichern, die entsprechend ihrer Reihenfolge mittels \1, \2,... \9 referenziert werden.
 
==== Beispiel ====
"isst" soll in allen Zeilen durch "ist" ersetzt werden.
* Eigentlich müssten pro String ein Anfangs-/Ende-Delimiter verwendet werden.
/isst//ist/
* beide Strings müssten durch "/" begrenzt werden
* sed verschmilzt die mittleren Schrägstriche zu einem!
/isst/ist/
* # dies erscheint zunächst unlogisch.
 
Der Befehl "s" für "suchen & ersetzen" steht vor(!) der RE.
 
sed 's/isst/ist/' < sed-test.txt
* Befehl "s" steht am Anfang!
* sed selektiert alle Zeilen, in denen "isst" vorkommt, ersetzt "isst" durch "ist"
* und gibt das Ergebnis am Bildschirm aus
 
Um die Änderungen in die Datei zu schreiben, gibt es zwei Möglichkeiten:
 
===== mit Hilfe einer temporären Datei =====
sed 's/isst/ist/' < sed-test.txt > sed-test2.txt * Ausgabe in temporäre Datei umleiten
 
vim sed-test2.txt* Ergebnis kontrollieren!
 
mv sed-test2.txt sed-test.txt* Originaldatei ersetzen durch temporäre Datei
 
===== direkt =====
sed -i 's/isst/ist/' sed-test.txt* Vorsicht, Änderungen werden direkt in Datei geschrieben!
 
Im Beispiel würde sed in jeder Zeile nur das erste gefundene "isst" durch "ist" ersetzen.
* Um zu erreichen, dass alle Fundstellen geändert werden, muss ans Ende der Anweisung der g-Spezifizierer (=global) gesetzt werden:
 
sed 's/isst/ist/g' < sed-test.txt
 
=== Selektives Suchen und Ersetzen ===
Beim "normalen" Suchen und Ersetzen werden alle Zeilen in den Suchvorgang einbezogen.
* Es kommt jedoch vor, dass die Ersetzung nur innerhalb eines bestimmten Bereiches erfolgen soll.
* Die Bereichsauswahl kann, wie oben beschrieben, über eine RE oder explizit erfolgen.
 
==== Beispiel ====
Ans Ende aller Zeilen, in denen "isst" vorkommt, soll " --Fehler!" angehängt werden.
* Das normale Suchen und Ersetzen hilft hierbei nicht weiter, denn "isst" soll ja nicht ersetzt werden, sondern dient nur Selektion der Zeilen, an die das Suffix angehängt werden soll.
 
Es sind also zwei Vorgänge erforderlich:* Bereichsauswahl über die RE "/isst/"
* Suchen des Zeilenendes und ersetzen durch " --Fehler!".
 
Genau genommen wird nicht das Zeilenende ersetzt, sondern ein gedachte fiktives "leer-Zeichen" (sozusagen "") vor dem Zeilenende.
 
Damit sed weiß, dass sich Suchen und Ersetzen nur auf die Bereichsauswahl bezieht, steht es hinter der Bereichsauswahl in geschweiften Klammern.
* Sie können auch weggelassen werden.
* Ich rate jedoch dazu, sie zu verwenden, da die Logik des Befehls dadurch klarer wird.
 
sed '/isst/{s/$/ --Fehler!/}' < sed-test.txt
* /isst/ -> Bereichsauswahl über RE
* {...} -> Anweisung in "{...}" bezieht sich auf die vorangestellte Bereichsauswahl
* $ -> Platzhalterzeichen für "Zeilenende" (in Suchen & Ersetzen Anweisungen)
* s/$/ --Fehler!/ -> fiktives "leer-Zeichen" vor dem Zeilenende wird ersetzt durch " --Fehler!"
 
Bei expliziter Bereichsauswahl funktioniert dies analog.
 
==== Beispiel ====
Ans Ende der 2.
* und 3.
* Zeile soll " --Fehler!" gesetzt werden.
 
sed '2,3{s/$/ --Fehler!/}' < sed-test.txt
* 2,3 -> explizite Bereichsauswahl: Zeile 2-3
 
Beachten Sie, dass die explizite Bereichsauswahl durch keine Delimiterzeichen "/" eingegrenzt ist.
 
==== Beispiel ====
Ans Ende der letzten Zeile soll " --Ende" gesetzt werden.
 
sed '${s/$/ --Fehler!/}' < sed-test.txt
* # $ -> explizite Bereichsauswahl; "$" steht hier für "letzte Zeile"
 
==== Beispiel ====
an den Anfang der ersten Zeile soll "Anfang--" gesetzt werden.
 
sed '1{s/^/Anfang--/}' < sed-test.txt
* 1 -> explizite Bereichsauswahl
* ^ -> Platzhalterzeichen für "Zeilenanfang"
* ein fiktives "leer-Zeichen" ("") am Zeilenanfang wird ersetzt durch "Anfang--"
 
Der vorige Befehl funktioniert auch ohne {}, ist aber schwerer zu lesen:
 
sed '1s/^/Anfang--/' < sed-test.txt
 
=== Control-Character ===
Mit Hilfe von sed können verschiedenste Konvertierungen durchgeführt werden, zum Beispiel von DOS- (CR-LF) zix Dateiendezeichen (LF).
* Control-Character können entweder als escape-character oder als hexadezimal-character dargestellt werden.
 
==== Wichtige control-character ====
Bezeichnung escape hex "cat -A"
linefeed \n \x0a $
carriage-return \r \x0d ^M
tab \t \x09 ^I
 
Kontrollzeichen innerhalb von Variablen lassen sich auch sehr gut mit Hilfe des l-Befehls von sed am Bildschirm darstellen.
* Dies ist eine Alternative zu "cat -A"
 
a=$'Tabulator: \x09 CR: \x0d LF: \x0a'
echo -e "$a" | sed -n 'l'
 
==== Escape-character ====
a="Zeile1\r\nZeile2"
 
am Ende von Zeile1 steht CR-LF (=DOS-Zeilenende)
 
echo -e "$a" | cat -A
 
Inhalt wird inkl.
* Kontrollzeichen ausgegeben und darstellbar gemacht (cat -A), der carriage-return wird als ^M dargestellt (0x0D)
 
echo -e "$a" | sed 's/\r//' | cat -A
 
der carriage-return wird durch "leer" ersetzt, ^M wird nicht mehr angezeigt
 
unset a
 
==== Hexadezimal-character ====
a=$'Zeile1\x0d\x0aZeile2'
 
am Ende von Zeile1 steht CR-LF (0x0d+0x0a)
 
echo -e "$a" | cat -A
  echo -e "$a" | sed 's/\x0d//' | cat -A
  unset a
 
=== Beispiele ===
==== Text in Dateien mit RegEx ====
In this article let us review how to use sed substitute command “s”.
* The `s’ command is probably the most important in `sed’ and has a lot of different options.
 
The `s’ command attempts to match the pattern space against the supplied REGEXP; if the match is successful, then that portion of the pattern space which was matched is replaced with REPLACEMENT.
 
Syntax:
#sed 'ADDRESSs/REGEXP/REPLACEMENT/FLAGS' filename
 
*  s is substitute command
*  / is a delimiter
*  REGEXP is regular expression to match
*  REPLACEMENT is a value to replace
 
 
 
g Replace all the instance of REGEXP with REPLACEMENT
*  n Could be any number,replace nth instance of the REGEXP with REPLACEMENT.
*  p If substitution was made, then prints the new pattern space.
*  i match REGEXP in a case-insensitive manner.
*  w file If substitution was made, write out the result to the given file.
*  We can use different delimiters ( one of @ % ; : ) instead of /
 
 
 
Let us first create thegeekstuff.txt file that will be used in all the examples mentioned below.
 
cat thegeekstuff.txt
# Instruction Guides
1.
* Linux Sysadmin, Linux Scripting etc.
2.
* Databases - Oracle, mySQL etc.
3.
* Security (Firewall, Network, Online Security etc)
4.
* Storage in Linux
5.
* Productivity (Too many technologies to explore, not much time available)
# Additional FAQS
6.
* Windows- Sysadmin, reboot etc.
 
Let us review some interesting examples for substitution now.
 
==== Ersetzen von “Linux” durch “Unix” (s) ====
In the example below, in the output line “1.
* Linux-Unix Sysadmin, Linux Scripting etc” only first Linux is replaced by Linux-Unix.
* If no flags are specified the first match of line is replaced.
 
sed 's/Linux/Unix/' thegeekstuff.txt
# Instruction Guides
1.
* Unix Sysadmin, Linux Scripting etc.
2.
* Databases - Oracle, mySQL etc.
3.
* Security (Firewall, Network, Online Security etc)
4.
* Storage in Unix
5.
* Productivity (Too many technologies to explore, not much time available)
# Additional FAQS
6.
* Windows- Sysadmin, reboot etc.
 
==== Alle Treffer ersetzen (s//g) ====
The below sed command replaces all occurrences of Linux to Linux-Unix using global substitution flag “g”.
 
sed 's/Linux/Linux-Unix/g' thegeekstuff.txt
# Instruction Guides
1.
* Linux-Unix Sysadmin, Linux-Unix Scripting etc.
2.
* Databases - Oracle, mySQL etc.
3.
* Security (Firewall, Network, Online Security etc)
4.
* Storage in Linux-Unix
5.
* Productivity (Too many technologies to explore, not much time available)
# Additional FAQS
6.
* Windows- Sysadmin, reboot etc.
 
==== Jeden zweiten Treffer ersetzen (s//2) ====
In the example below, in the output line “1.
* Linux Sysadmin, Linux-Unix Scripting etc.” only 2nd occurance of Linux is replaced by Linux-Unix.
 
sed 's/Linux/Linux-Unix/2' thegeekstuff.txt
# Instruction Guides
1.
* Linux Sysadmin, Linux-Unix Scripting etc.
2.
* Databases - Oracle, mySQL etc.
3.
* Security (Firewall, Network, Online Security etc)
4.
* Storage in Linux
5.
* Productivity (Too many technologies to explore, not much time available)
# Additional FAQS
6.
* Windows- Sysadmin, reboot etc.
 
==== Nur ersetzen, wenn eine Zeile einen Treffer ergibt ====
In this example, if the line matches with the pattern “-”, then it replaces all the characters from “-” with the empty.
 
sed '/\-/s/\-.*//g' thegeekstuff.txt
# Instruction Guides
1.
* Linux Sysadmin, Linux Scripting etc.
2.
* Databases
 
3.
4.
5.
#
6.
 
Security (Firewall, Network, Online Security etc)
Storage in Linux
Productivity (Too many technologies to explore, not much time available)
Additional FAQS
Windows
 
==== Letzten X Zeichen jeder Zeile löschen ====
This sed example deletes last 3 characters from each line.
 
sed 's/...$//' thegeekstuff.txt
# Instruction Gui
1.
* Linux Sysadmin, Linux Scripting e
2.
* Databases - Oracle, mySQL e
3.
* Security (Firewall, Network, Online Security e
4.
* Storage in Li
5.
* Productivity (Too many technologies to explore, not much time availab
# Additional F
6.
* Windows- Sysadmin, reboot e
 
==== Kommentare löschen ====
Delete all the comment lines from a file as shown below using sed command.
 
'''sed -e 's/#.*//' thegeekstuff.txt'''
1.
* Linux Sysadmin, Linux Scripting etc.
2.
* Databases - Oracle, mySQL etc.
3.
* Security (Firewall, Network, Online Security etc)
4.
* Storage in Linux
5.
* Productivity (Too many technologies to explore, not much time available)
6.
* Windows- Sysadmin, reboot etc.
 
==== Kommentare und leere Zeilen löschen ====
In this example, there are two commands seperated by ‘;’
 
First command replaces the lines starting with the # to the blank lines
 
Second command deletes the empty lines.
 
'''sed -e 's/#.*//;/^$/d' thegeekstuff.txt'''
1.
* Linux Sysadmin, Linux Scripting etc.
2.
* Databases - Oracle, mySQL etc.
3.
* Security (Firewall, Network, Online Security etc)
4.
* Storage in Linux
5.
* Productivity (Too many technologies to explore, not much time available)
6.
* Windows- Sysadmin, reboot etc.
 
==== Zeilenwechsel konvertieren ====
===== DOS newlines (CR/LF) ins Unix-Format ändern =====
Copy the DOS file to Unix, you could find \r\n in the end of each line.
 
This example converts the DOS file format to Unix file format using sed command.
 
'''$sed 's/.$//' filename'''
 
==== Rekursives Suchen und Ersetzen ====
Ersetzen einer Zeichenkette in allen Daten einer Verzeichnisstruktur.
 
'''find . -type f -print0 | xargs -0 -n 1 sed -i -e "s/suche/ersetze/g"'''
 
===== Beispiel mit escape Zeichen \ =====
''‘typo3temp/pics''' ersetzen mit ''‘../../typo3temp/pics'''
 
'''find . -name *.html -type f -print0 | xargs -0 -n 1 sed -i -e \ "s/’temp\/pics/’..\/..\/temp\/pics/g"'''
 
==== HTML Tags aus Datei entfernen ====
In this example, the regular expression given in the sed command matches the html tags and replaces with the empty.
 
'''sed -e 's/<[^>]*>//g''''
This <b> is </b> an <i>example</i>.
This is an example.


== Mehrere Kommandos [-e] ==
== Mehrere Kommandos [-e] ==

Version vom 31. März 2023, 10:45 Uhr

sed - strom-orientierter Editor zur Bearbeitung von Dateien anhand von Regeln

Beschreibung

  • Da es ein "nicht-interaktives" Programm ist, kann es, falls gewünscht, zur Automatisierung der Bearbeitung verwendet werden.
  • Der Name sed ist eine Abkürzung für stream editor, und das Dienstprogramm leitet viele seiner Befehle vom ed line-editor ab (ed war der erste UNIX-Texteditor).
  • So können Sie mehrere Dateien bearbeiten oder gängige Bearbeitungsvorgänge durchführen, ohne jemals vi oder emacs öffnen zu müssen.
  • sed liest aus einer Datei oder von der Standardeingabe und gibt auf der Standardausgabe aus.
  • sed hat zwei Puffer, die Musterpuffer und Haltepuffer genannt werden.
  • Beide sind anfangs leer.

So funktioniert's

  • Geben Sie den Musterpuffer auf stdout aus.
  • Der Stream-Editor ist kein herkömmlicher Editor wie Vi oder Emacs.
  • Sed arbeitet nicht interaktiv, sondern wird über Kommandozeilenoptionen oder ein Skript gesteuert.
  • Sed verändert nicht das Original, sondern schreibt das Ergebnis auf die Standardausgabe.
  • Sed lädt die aktuell betrachtete Zeile in einen temporären Puffer - im Folgenden als Arbeitspuffer bezeichnet.

Unix Sed Arbeitsmethodik

Dies wird als ein Ausführungszyklus bezeichnet.

  • Der Zyklus wird fortgesetzt, bis das Ende der Datei/Eingabe erreicht ist # Lesen einer ganzen Zeile aus stdin/file.
  1. Entfernt alle nachstehenden Zeilenumbrüche.
  2. Legt die Zeile in seinen Musterpuffer.
  3. Ändert den Musterpuffer entsprechend den übergebenen Befehlen.

Installation

Syntax

Optionen

Parameter

Umgebungsvariablen

Exit-Status

Anwendungen

Fehlerbehebung

Konfiguration

Dateien

Sicherheit

Siehe auch

Unterseiten

Dokumentation

  1. https://www.gnu.org/software/sed/manual/sed.html

RFC

Man-Pages

Info-Pages

Links

Einzelnachweise

Projekt

Weblinks

Testfragen

Testfrage 1

Antwort1

Testfrage 2

Antwort2

Testfrage 3

Antwort3

Testfrage 4

Antwort4

Testfrage 5

Antwort5

TMP

Aufruf

Sed/Aufruf

Dateiübergabe

Sed/Dateiübergabe

Ausgabe

Sed/Ausgabe

Kommandoübersicht

Sed/Kommandos

Substitutionen

Sed/Substitutionen

Reguläre Ausdrücke

Sed/Regular Expressions

Beispieltexte

Sed/Beispieltext

Anweisungen

Sed/Anweisungen

Zeilen ausgeben

Sed/Zeilen ausgeben

Adressierung

Sed/Adressierung

Zeilen löschen

Sed/Zeilen löschen

Suchen und Ersetzen

Sed/Suchen und Ersetzen

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

Einfügen [i|a]

Der einzufügende Text muss auf einer neuen Zeile stehen, wobei jede Zeile bis auf die letzte durch einen Backslash abzuschließen ist. * »i« (insert) fügt den Text vor der betreffenden Zeile ein

  • »a« (append) schreibt den neuen Text nach der Zeile.

Beispiel

sed '8i\
 ===========================================\
 Angabe Bereich von Zeilen\
 ===========================================' test.txt
 1 Der Aufruf des Stream Editors besitzt immer das Format:
 2 
 3 sed 'Kommando' Dateiname
 4 
 5 Dabei kann dem Kommando mitgeteilt werden, welche Zeilen der
 6 Eingabedatei es bearbeiten soll. 
  • Als Adressierung kommen folgende
 7 Mechanismen in Frage:
 ===========================================
 Angabe Bereich von Zeilen
 ===========================================
 8
 9 Keine Angabe Alle Zeilen
 10 Nummer Genau diese Zeile
 11 Start, Ende Alle Zeilen von "Start" bis "Ende"
 12 $ Symbolisiert die letzte Zeile
 13 RegEx Zeilen, die den Regulären Ausdruck enthalten
 14 1, RegEx Von Zeile 1 bis zur ersten Zeile, die RegEx enthält

Einfügen aus einer Datei [r]

In seltenen Fällen wird ein Text nur in eine einzige Datei eingefügt werden, sonst wäre der Griff zu einem herkömmlichen Editors der effizientere Weg.

Eine Methode ist, den einzusetzenden Text in einer separaten Datei zu erfassen und Sed jene unterzuschieben.

cat ins.txt
 ===========================================
 Angabe Bereich von Zeilen
 ===========================================
 Dieser Text lässt sich mittels des r-Kommandos einfach an beliebiger Stelle einordnen:
sed '8r ins.txt' test.txt
 1 Der Aufruf des Stream Editors besitzt immer das Format:
 2 
 3 sed 'Kommando' Dateiname
 4 
 5 Dabei kann dem Kommando mitgeteilt werden, welche Zeilen der
 6 Eingabedatei es bearbeiten soll. 
  • Als Adressierung kommen folgende
 7 Mechanismen in Frage:
 8 
 ===========================================
 Angabe Bereich von Zeilen
 ===========================================
 9 Keine Angabe Alle Zeilen
 10 Nummer Genau diese Zeile
 11 Start, Ende Alle Zeilen von "Start" bis "Ende"
 12 $ Symbolisiert die letzte Zeile
 13 RegEx Zeilen, die den Regulären Ausdruck enthalten
 14 1, RegEx Von Zeile 1 bis zur ersten Zeile, die RegEx enthält

Schreiben in eine Datei [w]

Das Ergebnis des Stream Editors lässt sich in einer Datei speichern:

sed -n '/^1/w out.txt' test.txt
cat out.txt
 10 Nummer Genau diese Zeile
 11 Start, Ende Alle Zeilen von "Start" bis "Ende"
 12 $ Symbolisiert die letzte Zeile
 13 RegEx Zeilen, die den Regulären Ausdruck enthalten
 14 1, RegEx Von Zeile 1 bis zur ersten Zeile, die RegEx enthält

Änderungen in Datei schreiben und auf Konsole (s//gpw)

The example below has substitution with three flags.

  • It substitutes all the occurance of Linux to Linux-Unix and prints the substituted output as well as written the same to the given the file.
sed -n 's/Linux/Linux-Unix/gpw output' thegeekstuff.txt
1. Linux-Unix Sysadmin, Linux-Unix Scripting etc.
4. Storage in Linux-Unix
cat output
1. Linux-Unix Sysadmin, Linux-Unix Scripting etc.
4. Storage in Linux-Unix

Dateien direkt bearbeiten

  • Häufig ist es sinnvoll Dateien direkt zu bearbeiten, anstatt sie auf die Standardausgabe zu schreiben.
  • Dies ist mit der Option »-i« möglich.

Der folgende Befehl ersetzt alle "Hallo" in der Datei test.txt durch "Hey", ohne eine Ausgabe zu erzeugen.

sed -i"" 's|Hallo|Hey|g' test.txt
  • Achtung! Das "" nach -i ist notwendig.
  • Mit dieser Option ist es auch sehr einfach möglich mehrere Dateien zu bearbeiten.

Hiermit werden alle Dateien im aktuellen Ordner die mit .txt enden wie gerade beschrieben bearbeitet:

sed -i"" 's|Hallo|Hey|g' *.txt

Dateien ergänzen

Zeile am Dateianfang einfügen

Dies ist auch ohne sed möglich, zum Beispiel mit Hilfe von echo und cat

cat - <<< "Anfang" sed-test.txt > sed-test2.txt
echo "Anfang" | cat - sed-test.txt > sed-test2.txt
echo "Anfang" > sed-test2.txt; cat sed-test.txt >> sed-test2.txt

Mit Hilfe von sed geht dies eleganter.

sed '1iAnfang' < sed-test.txt > sed-test2.txt
* 1=Zeile 1 (explizite Bereichsauswahl)
* i=insert-Befehl

Zeile innerhalb des Textes einfügen

Die folgende Anweisung fügt eine neue Zeile vor der vorletzten Zeile ein.

sed '/vorletzte/idies ist die vorvorletzte Zeile' < sed-test.txt > sed-test2.txt
* /vorletzte/ = Bereichsauswahl über RE
* i=insert-Befehl

Zeile ans Dateiende anhängen

sed '$aEnde' < sed-test.txt > sed-test2.txt
* $=letzte Zeile (explizite Bereichsauswahl)
* a=append-Befehl

Zeichen am Zeilenanfang einfügen

Das Zeichen "#" soll in allen Zeilen an den Zeilenanfang gesetzt werden.

sed 's/^/#/' < sed-test.txt
* s =suchen & ersetzen
* /^/ ="Zeilenanfangszeichen"
* /#/ = Replace-String

Die Anweisung erscheint auf den ersten Blick nicht ganz logisch.

  • Sie ist folgendermaßen zu interpretieren: Ersetze in jeder Zeile das am Zeilenanfang gedachte fiktive "leer-Zeichen" (sozusagen "") durch das #-Zeichen.

Es wird also nicht der Zeilenanfang selbst ersetzt, was ja gar nicht möglich wäre, da es kein Zeilenanfangszeichen analog zum Zeilenendezeichen gibt.

  • Einfacher verständlich wird die Anweisung, wenn man ein bestimmtes Wort am Zeilenanfang ersetzen lässt:
sed 's/^Hier/Dort/' < sed-test.txt 
  • Hier" am Zeilenanfang wird ersetzt durch "Dort"
Beispiel

Das Zeichen "#" soll bei Zeilen, die mit "Hier" beginnen an den Zeilenanfang gesetzt werden.

sed 's/^Hier/#Hier/' < sed-test.txt
Beispiel

Das Zeichen "#" soll in Zeilen, in denen "letzt" vorkommt, an den Zeilenanfang gesetzt werden.

  • Dieser Fall unterscheidet sich von den vorigen, weil das "suchen & ersetzen" auf einen bestimmten Bereich beschränkt werden muss.
  • Hierzu werden geschweifte Klammern verwendet.
sed '/letzt/{s/^/#/}' < sed-test.txt
* /letzt/ =RE; Zeilen, in denen "letzt" vorkommt, werden selektiert
* {s...} = "suchen & ersetzen" wird nur in den selektierten Zeilen ausgeführt

Nächste Zeile beabeiten[n]

Soll erst die dem Suchmuster folgende Zeile manipuliert werden, ist das n-Kommando der beste Kandidat:

sed -n '8,${n;s/\(.\{1,\}\)/*\1/p;}' test.txt
 * 9 Keine Angabe Alle Zeilen
 *11 $ Symbolisiert die letzte Zeile
 *13 RegEx Zeilen, die den Regulären Ausdruck enthalten

Die Kommandozeile ist schwer verdaulich...

  • aber der Reihe nach:
»-n« als Kommandozeilenoption besagt, dass die Ausgabe einzig die bearbeiteten Zeilen betreffen soll.
Da jedoch das Flag »s«  sämtliche Ausgaben »verschluckt«, muss »p« am Ende bemüht werden.
»8,$«  adressiert die Zeilen 8 bis zum Ende der Datei.
  • Die erste Zeile, die also gefunden wurde, ist die 8.
»n«  als Substitutionskommando bewirkt, dass die nächste Zeile bearbeitet wird - Zeile 9.
  • Diese 9.
  • Zeile wird nun substituiert.
».\{1,\}«  meint »mindestens ein (\{1,\}) beliebiges (.) Zeichen.
Da jede Zeile im Beispiel zumindest die Zeilenummer umfasst und das komplette Muster mit »\(...\)« gespeichert wird, erscheint die gesamte Zeile mit vorangestelltem Stern (*\1) in der Ausgabe...
Sed fährt mit der folgenden Zeile (10) fort, die (wegen Flag »n«) übersprungen wird.

Zeichen tauschen [y]

  • Einzelne Zeichen lassen sich durch andere einzelne Zeichen ersetzen.
  • Das Zeichen an Position x der Liste zu ersetzender Zeichen wird in das Zeichen an Position x der Liste der neuen Zeichen transformatiert.

Damit ist klar, dass beide Zeichenlisten dieselbe Länge besitzen müssen:

sed 'y/abcdefghijklmnopqrstuvwxyz/zyxwvutsrqponmlkjihgfedcba/' test.txt
 1 Dvi Afuifu wvh Sgivzn Ewrglih yvhrgag rnnvi wzh Flinzg:
 2 
 3 hvw 'Klnnzmwl' Dzgvrmznv
 4 
 5 Dzyvr pzmm wvn Klnnzmwl nrgtvgvrog dviwvm, dvoxsv Zvrovm wvi
 6 Ermtzyvwzgvr vh yvziyvrgvm hloo. 
  • Aoh Awivhhrvifmt plnnvm ulotvmwv
 7 Mvxszmrhnvm rm Fiztv:
 8 
 9 Kvrmv Amtzyv Aoov Zvrovm
 10 Nfnnvi Gvmzf wrvhv Zvrov
 11 Sgzig, Emwv Aoov Zvrovm elm "Sgzig" yrh "Emwv"
 12 $ Sbnylorhrvig wrv ovgagv Zvrov
 13 RvtEc Zvrovm, wrv wvm Rvtfo/auml;ivm Afhwifxp vmgszogvm
 14 1, RvtEc Vlm Zvrov 1 yrh afi vihgvm Zvrov, wrv RvtEc vmgsäog

Sed vorzeitig beenden [q]

Manchmal ist es sinnvoll, den Stream Editor vorzeitig zu beenden:

sed '3q' test.txt
 1 Der Aufruf des Stream Editors besitzt immer das Format:
 2 
 3 sed 'Kommando' Dateiname
sed -n '/sed/{p;q;}' test.txt
 3 sed 'Kommando' Dateiname

Zeilentausch [h|g|G|x ]

  • Die aktuell bearbeitete Zeile hält der Sed in einem Zwischenspeicher und bearbeitet sie in diesem »Pattern Space«.
  • Hat der Editor seine Arbeit beendet, gibt er die Zeile aus und lädt die folgende Zeile der Eingabedatei in den Zwischenspeicher.
h Mit dem Kommando »h« kann der aktuelle Zwischenspeicher in einen Puffer gesichert werden (»holding buffer«).
G Das Kommando »G« fügt den Inhalt dieses Sicherungspuffers hinter der aktuell bearbeiteten Zeile ein.
g »g« ersetzt die aktuelle Zeile durch den Inhalt des Sicherungspuffers.
x Den Inhalt der beiden Puffer vertauscht das Kommando »x«.

Beispiel 1

sed -e '/sed/{h;d;}' -e '4G' -e '4q' test.txt
 1 Der Aufruf des Stream Editors besitzt immer das Format:
 2 
 4 
 3 sed 'Kommando' Dateiname
sed -e '/sed/{h;d;}' -e '4g' -e '5q' test.txt
 1 Der Aufruf des Stream Editors besitzt immer das Format:
 2 
 3 sed 'Kommando' Dateiname
 5 Dabei kann dem Kommando mitgeteilt werden, welche Zeilen der
Erklärung
  • Das erste Kommando »-e '/sed/{h;d;}'« in teilt dem Editor mit, die Zeile, die sed enthält, zuerst in den Zwischenspeicher zu sichern und nachfolgend zu löschen.
  • Das zweite Kommando vollzieht das Einfügen des Inhalts des Puffers. »-e '4G'« fügt nach der 4.Zeile ein (Achtung: die gelöschte Zeile wird mitgezählt!)»-e '4g'« ersetzt die 4.Zeile.
  • Das letzte Kommando »-e '4q'« beendet die Arbeit des Editors nach der 4.
  • Zeile.

Beispiel 2

sed -e '/Aufruf/h' -e '/Angabe/x' -e '$G' test.txt
 1 Der Aufruf des Stream Editors besitzt immer das Format:
 2 
 3 sed 'Kommando' Dateiname
 4 
 5 Dabei kann dem Kommando mitgeteilt werden, welche Zeilen der
 6 Eingabedatei es bearbeiten soll. 
  • Als Adressierung kommen folgende
 7 Mechanismen in Frage:
 8 
 1 Der Aufruf des Stream Editors besitzt immer das Format:
 10 Nummer Genau diese Zeile
 11 Start, Ende Alle Zeilen von "Start" bis "Ende"
 12 $ Symbolisiert die letzte Zeile
 13 RegEx Zeilen, die den Regulären Ausdruck enthalten
 14 1, RegEx Von Zeile 1 bis zur ersten Zeile, die RegEx enthält
 9 Keine Angabe Alle Zeilen
Erklärung
  • Enthält eine Zeile das Muster »Aufruf«, wird sie im Zwischenpuffer abgelegt.
  • Steht in einer Zeile »Angabe«, so wird diese Zeile mit dem Inhalt des Zwischenpuffers vertauscht.
  • Der Inhalt des Zwischenpuffers wird hinter der letzten Zeile eingefügt.

Sed-Skripte

Kompliziertere und häufig benötigte Sed-Aufrufe schreibt man besser in eine Datei.

  • Der Aufruf von Sed sieht dann wie folgt aus:
sed -f <Skript_Datei> <zu_bearbeitende_Datei>

Beim Schreiben eines Skripts gelten folgende Regeln: * Beginnt eine Zeile mit einem Doppelkreuz #, so handelt es sich um einen Kommentar

  • Vor und nach einem Kommando dürfen keine Leerzeichen, Tabulatoren...
  • stehen
  • Mehrere Kommandos auf einer Zeile, sind sie durch Semikola voneinander zu trennen

Der Stream Editor wird das gesamte Skript auf jede Zeile der Eingabedatei anwenden.

Als Beispiel dient ein Skript, dass alle deutschen Umlaute in der Eingabedatei umschreibt.

cat umlaut
 ## Ersetzen Umlaute
 s/ä/\ae/g
 s/ü/\ue/g
 s/ö/\oe/g
 s/Ä/\ae/g
 s/Ü/\Ue/g
 s/Ö/\Oe/g
 s/ß/\ss/g

Das Anwendungsbeispiel demonstriert die Möglichkeit der Kopplung von Kommandozeilenbefehlen und einem Skript:

sed -e '1,12d' -f umlaut test.txt
 13 RegEx Zeilen, die den Regulären Ausdruck enthalten
 14 1, RegEx Von Zeile 1 bis zur ersten Zeile, die RegEx enthält