Sed: Unterschied zwischen den Versionen

Aus Foxwiki
Keine Bearbeitungszusammenfassung
Keine Bearbeitungszusammenfassung
Zeile 1: Zeile 1:
= {{anchor|RefHeading339881143486078}} Linux- Stream Editor – sed =
= Linux- Stream Editor – sed =


== {{anchor|RefHeadingToc33675998840441}} Einführung ==
== Einführung ==


* sed is a “non-interactive” stream-oriented editor. Since its an “non-interactive” it can be used to automate editing if desired.  
* sed is a “non-interactive” stream-oriented editor. Since its an “non-interactive” it can be used to automate editing if desired.  
Zeile 9: Zeile 9:
* sed has two buffers which are called pattern buffer and hold buffer. Both are initially empty.  
* sed has two buffers which are called pattern buffer and hold buffer. Both are initially empty.  


 
=== Arbeitsweise<div >aus regex-skript</div> ===
 
=== {{anchor|RefHeadingToc35291725578261}} Arbeitsweise<div style="margin-left:0cm;margin-right:0cm;">aus regex-skript</div> ===


[[Image:Grafik1.png|right|top]]Print the pattern buffer to stdout. Der Stream Editor ist kein herkömmlicher Editor wie Vi oder Emacs. Sed arbeitet nicht interaktiv; er wird mittels Kommandozeilenoptionen oder durch ein Skript gesteuert.  
[[Image:Grafik1.png|right|top]]Print the pattern buffer to stdout. Der Stream Editor ist kein herkömmlicher Editor wie Vi oder Emacs. Sed arbeitet nicht interaktiv; er wird mittels Kommandozeilenoptionen oder durch ein Skript gesteuert.  
Zeile 19: Zeile 17:
Die aktuell betrachtete Zeile lädt der Sed in einen temporären Puffer - nachfolgend als Arbeitspuffer bezeichnet.  
Die aktuell betrachtete Zeile lädt der Sed in einen temporären Puffer - nachfolgend als Arbeitspuffer bezeichnet.  


==== {{anchor|RefHeadingToc32081725578261}} Unix Sed Working methodology ====
==== Unix Sed Working methodology ====


This is called as one execution cycle. Cycle continues till end of file/input is reached.# Read a entire line from stdin/file.  
This is called as one execution cycle. Cycle continues till end of file/input is reached.# Read a entire line from stdin/file.  
Zeile 25: Zeile 23:
# Places the line, in its pattern buffer.  
# Places the line, in its pattern buffer.  
# Modify the pattern buffer according to the supplied commands.  
# Modify the pattern buffer according to the supplied commands.  


==== Aufruf ====
==== Aufruf ====
Zeile 46: Zeile 42:
sed arbeitet zeilenorientiert, d.h. es liest die Eingabedatei Zeile pro Zeile und wendet auf jede Zeile den bzw. die Befehle an. Eine Zeile endet dort, wo das Zeichen "linefeed", also 0x0A steht.  
sed arbeitet zeilenorientiert, d.h. es liest die Eingabedatei Zeile pro Zeile und wendet auf jede Zeile den bzw. die Befehle an. Eine Zeile endet dort, wo das Zeichen "linefeed", also 0x0A steht.  


=== {{anchor|RefHeading39701624094027}} Dateiübergabe an sed ===
=== Dateiübergabe an sed ===


==== Output von cat als Input von sed ====
==== Output von cat als Input von sed ====
Zeile 60: Zeile 56:
sed [anweisungen...] sed-test.txt
sed [anweisungen...] sed-test.txt


=== {{anchor|RefHeading39721624094027}} Ausgabe ===
=== Ausgabe ===


Die Ausgabe erfolgt nach Stdout, also auf den Bildschirm. Sie kann mittels Pipe-Symbol an andere Kommandos übergeben oder in eine Datei umgeleitet werden:  
Die Ausgabe erfolgt nach Stdout, also auf den Bildschirm. Sie kann mittels Pipe-Symbol an andere Kommandos übergeben oder in eine Datei umgeleitet werden:  
Zeile 72: Zeile 68:
cat sed-test-txt | sed [anweisungen...] > output.txt
cat sed-test-txt | sed [anweisungen...] > output.txt


=== {{anchor|RefHeading3008101082722535}} Kommandoübersicht ===
=== Kommandoübersicht ===


Die Aktionen von Sed werden durch Kommandos gesteuert. Diese Kommandos können Zeilenangaben oder -bereiche enthalten, dann betrachtet der Editor nur die Zeilen der zu bearbeitenden Datei.  
Die Aktionen von Sed werden durch Kommandos gesteuert. Diese Kommandos können Zeilenangaben oder -bereiche enthalten, dann betrachtet der Editor nur die Zeilen der zu bearbeitenden Datei.  
Zeile 80: Zeile 76:
Bevor wir das Verhalten anhand von Beispielen kennen lernen, seien alle Kommandos aufgeführt:  
Bevor wir das Verhalten anhand von Beispielen kennen lernen, seien alle Kommandos aufgeführt:  


 
{|class="wikitable"  
{| style="border-spacing:0;margin:auto;width:17.501cm;"
|-
|-
| align=center style="border-top:0.05pt solid #000000;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | <tt>'''a '''</tt>
| align=center | <tt>'''a '''</tt>
| style="border:0.05pt solid #000000;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | Fügt eine oder mehrere Zeilen an die aktuelle Zeile an  
| | Fügt eine oder mehrere Zeilen an die aktuelle Zeile an  
|-
|-
| align=center style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | <tt>'''c '''</tt>
| align=center | <tt>'''c '''</tt>
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | Ersetzt Text in der aktuellen Zeile  
| | Ersetzt Text in der aktuellen Zeile  
|-
|-
| align=center style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | <tt>'''d '''</tt>
| align=center | <tt>'''d '''</tt>
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | Löscht Zeile(n)  
| | Löscht Zeile(n)  
|-
|-
| align=center style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | <tt>'''g '''</tt>
| align=center | <tt>'''g '''</tt>
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | Kopiert den Inhalt eines temporären Puffers in den Arbeitspuffer (dessen alter Inhalt geht verloren)  
| | Kopiert den Inhalt eines temporären Puffers in den Arbeitspuffer (dessen alter Inhalt geht verloren)  
|-
|-
| align=center style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | <tt>'''G '''</tt>
| align=center | <tt>'''G '''</tt>
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | Fügt den Inhalt eines temporären Puffers an den Inhalt des Arbeitspuffers an  
| | Fügt den Inhalt eines temporären Puffers an den Inhalt des Arbeitspuffers an  
|-
|-
| align=center style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | <tt>'''h '''</tt>
| align=center | <tt>'''h '''</tt>
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | Kopiert den Inhalt des Arbeitspuffers in einen temporären Puffer  
| | Kopiert den Inhalt des Arbeitspuffers in einen temporären Puffer  
|-
|-
| align=center style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | <tt>'''H '''</tt>
| align=center | <tt>'''H '''</tt>
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | Fügt den Inhalt des Arbeitspuffers an einen temporären Puffer an  
| | Fügt den Inhalt des Arbeitspuffers an einen temporären Puffer an  
|-
|-
| align=center style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | <tt>'''i '''</tt>
| align=center | <tt>'''i '''</tt>
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | Fügt Text oberhalb der aktuellen Zeile ein  
| | Fügt Text oberhalb der aktuellen Zeile ein  
|-
|-
| align=center style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | <tt>'''l '''</tt>
| align=center | <tt>'''l '''</tt>
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | Zeigt nicht druckbare Zeichen an  
| | Zeigt nicht druckbare Zeichen an  
|-
|-
| align=center style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | <tt>'''n '''</tt>
| align=center | <tt>'''n '''</tt>
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | Wendet das nächste Kommando anstelle des aktuellen Kommandos auf die nächste Zeile an  
| | Wendet das nächste Kommando anstelle des aktuellen Kommandos auf die nächste Zeile an  
|-
|-
| align=center style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | <tt>'''p '''</tt>
| align=center | <tt>'''p '''</tt>
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | Druckt Zeile(n)  
| | Druckt Zeile(n)  
|-
|-
| align=center style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | <tt>'''q '''</tt>
| align=center | <tt>'''q '''</tt>
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | Beendet den Editor  
| | Beendet den Editor  
|-
|-
| align=center style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | <tt>'''r '''</tt>
| align=center | <tt>'''r '''</tt>
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | Liest Zeilen aus einer Datei  
| | Liest Zeilen aus einer Datei  
|-
|-
| align=center style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | <tt>'''! '''</tt>
| align=center | <tt>'''! '''</tt>
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | Wendet das Kommando auf Zeilen an, die nicht zutreffen  
| | Wendet das Kommando auf Zeilen an, die nicht zutreffen  
 


|-
|-
|}
|}
=== {{anchor|RefHeading3008121082722535}} Substitutionen ===
=== Substitutionen ===


Im Zusammenhang mit Substitutionen werden die Kommandos häufig als Flags bezeichnet.  
Im Zusammenhang mit Substitutionen werden die Kommandos häufig als Flags bezeichnet.  
Zeile 134: Zeile 128:
Die Wirkung mancher Kommandos (»g«) wird aus dem Kontext entschieden wird.  
Die Wirkung mancher Kommandos (»g«) wird aus dem Kontext entschieden wird.  


 
{|class="wikitable"  
{| style="border-spacing:0;margin:auto;width:17.501cm;"
|-
|-
| align=center style="border-top:0.05pt solid #000000;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | <tt>'''g '''</tt>
| align=center | <tt>'''g '''</tt>
| style="border:0.05pt solid #000000;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | Globale Ersetzung (jedes Vorkommen des Musters auf der Zeile)  
| | Globale Ersetzung (jedes Vorkommen des Musters auf der Zeile)  
|-
|-
| align=center style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | <tt>'''p '''</tt>
| align=center | <tt>'''p '''</tt>
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | Ausgabe der Zeile in Verbindung mit "s".  
| | Ausgabe der Zeile in Verbindung mit "s".  
|-
|-
| align=center style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | <tt>'''s '''</tt>
| align=center | <tt>'''s '''</tt>
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | Ersetzen eines Musters durch ein anderes  
| | Ersetzen eines Musters durch ein anderes  
|-
|-
| align=center style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | <tt>'''w '''</tt>
| align=center | <tt>'''w '''</tt>
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | Ausgabe der bearbeiteten Zeilen in eine Datei  
| | Ausgabe der bearbeiteten Zeilen in eine Datei  
|-
|-
| align=center style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | <tt>'''x '''</tt>
| align=center | <tt>'''x '''</tt>
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | Austausch des Inhalts des Zwischenspeichers mit der aktuell bearbeiteten Zeile  
| | Austausch des Inhalts des Zwischenspeichers mit der aktuell bearbeiteten Zeile  
|-
|-
| align=center style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | <tt>'''y '''</tt>
| align=center | <tt>'''y '''</tt>
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | Ersetzen eines Zeichens durch ein anderes  
| | Ersetzen eines Zeichens durch ein anderes  
 


|-
|-
|}
|}
=== {{anchor|RefHeading3008141082722535}} Reguläre Ausdrücke ===
=== Reguläre Ausdrücke ===


Folgende Reguläre Ausdrücke werden von sed unterstützt
Folgende Reguläre Ausdrücke werden von sed unterstützt


 
{|class="wikitable"  
{| style="border-spacing:0;margin:auto;width:17.501cm;"
|-
|-
| style="border-top:0.05pt solid #000000;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | <tt>'''^ '''</tt>
| | <tt>'''^ '''</tt>
| style="border:0.05pt solid #000000;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | Zeilenanfang  
| | Zeilenanfang  
|-
|-
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | <tt>'''$'''</tt>
| | <tt>'''$'''</tt>
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | Zeilenende (bei der Adressierung steht das Zeichen für die letzte Zeile)  
| | Zeilenende (bei der Adressierung steht das Zeichen für die letzte Zeile)  
|-
|-
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | <tt>'''. '''</tt>
| | <tt>'''. '''</tt>
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | Ein Zeichen (Ausnahme ist der Zeilenumbruch)  
| | Ein Zeichen (Ausnahme ist der Zeilenumbruch)  
|-
|-
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | <tt>'''<nowiki>* </nowiki>'''</tt>
| | <tt>'''<nowiki>* </nowiki>'''</tt>
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | Keine, eine oder mehrere Wiederholungen des vorhergehenden Buchstabens / der vorhergehenden Gruppe  
| | Keine, eine oder mehrere Wiederholungen des vorhergehenden Buchstabens / der vorhergehenden Gruppe  
|-
|-
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | <tt>'''[...] '''</tt>
| | <tt>'''[...] '''</tt>
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | Ein Zeichen aus der Menge  
| | Ein Zeichen aus der Menge  
|-
|-
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | <tt>'''[^...] '''</tt>
| | <tt>'''[^...] '''</tt>
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | Kein Zeichen aus der Menge  
| | Kein Zeichen aus der Menge  
|-
|-
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | <tt>'''\(...\) '''</tt>
| | <tt>'''\(...\) '''</tt>
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | Speichern des enthaltenen Musters  
| | Speichern des enthaltenen Musters  
|-
|-
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | <tt>'''& '''</tt>
| | <tt>'''& '''</tt>
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | Enthält das Suchmuster  
| | Enthält das Suchmuster  
|-
|-
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | <tt>'''\< '''</tt>
| | <tt>'''\< '''</tt>
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | Wortanfang  
| | Wortanfang  
|-
|-
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | <tt>'''\> '''</tt>
| | <tt>'''\> '''</tt>
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | Wortende  
| | Wortende  
|-
|-
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | <tt>'''x\{m\} '''</tt>
| | <tt>'''x\{m\} '''</tt>
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | m-fache Wiederholung des Zeichens x  
| | m-fache Wiederholung des Zeichens x  
|-
|-
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | <tt>'''x\{m,\} '''</tt>
| | <tt>'''x\{m,\} '''</tt>
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | Mindestens m-fache Wiederholung des Zeichens x  
| | Mindestens m-fache Wiederholung des Zeichens x  
|-
|-
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | <tt>'''x\{m,n\} '''</tt>
| | <tt>'''x\{m,n\} '''</tt>
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | Mindestens m-, maximal n-fache Wiederholung des Zeichens x  
| | Mindestens m-, maximal n-fache Wiederholung des Zeichens x  
 


|-
|-
|}
|}
=== {{anchor|RefHeading3008161082722535}} Beispieltexte ===
=== Beispieltexte ===


Die Handhabung des Stream Editors erlernen Sie vermutlich nur durch Beispiele. Zunächst soll es um die Möglichkeiten zur Adressierung von Zeilen mit Sed gehen (das Schema lässt sich u.a. auch im Vi anwenden)
Die Handhabung des Stream Editors erlernen Sie vermutlich nur durch Beispiele. Zunächst soll es um die Möglichkeiten zur Adressierung von Zeilen mit Sed gehen (das Schema lässt sich u.a. auch im Vi anwenden)


'''cat sedtest.txt<div style="margin-left:0cm;margin-right:0cm;"><span style="color:#000000;">Einrückungen?</span></div>
'''cat sedtest.txt<div >Einrückungen?</span></div>
  Der Aufruf des Stream Editors besitzt immer das Format:
  Der Aufruf des Stream Editors besitzt immer das Format:
   
   
      sed 'Kommando' Dateiname
sed 'Kommando' Dateiname
   
   
  Dabei kann dem Kommando mitgeteilt werden, welche Zeilen der
  Dabei kann dem Kommando mitgeteilt werden, welche Zeilen der
Zeile 220: Zeile 210:
  Mechanismen in Frage:
  Mechanismen in Frage:
   
   
  Keine Angabe   Alle Zeilen
  Keine Angabe Alle Zeilen
        Nummer Genau diese Zeile
Nummer Genau diese Zeile
        Start, Ende     Alle Zeilen von "Start" bis "Ende"
Start, Ende Alle Zeilen von "Start" bis "Ende"
        $       Symbolisiert die letzte Zeile
$ Symbolisiert die letzte Zeile
        RegEx   Zeilen, die den Regulären Ausdruck enthalten
RegEx Zeilen, die den Regulären Ausdruck enthalten
        1, RegEx       Von Zeile 1 bis zur ersten Zeile, die RegEx enthält
1, RegEx Von Zeile 1 bis zur ersten Zeile, die RegEx enthält


Um die spätere Arbeit des Editors besser verfolgen zu können, nummerieren wir noch die Datei:  
Um die spätere Arbeit des Editors besser verfolgen zu können, nummerieren wir noch die Datei:  


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


==== Erstellung einer Testdatei ====
==== Erstellung einer Testdatei ====


cat > sed-test.txt << EOF
cat > sed-test.txt << EOF
Zeile 255: Zeile 245:
EOF
EOF


==== Exkurs: Zeilen nummerieren mit nl<div style="margin-left:0cm;margin-right:0cm;">Beispiele einfügen</div> ====
==== Exkurs: Zeilen nummerieren mit nl<div >Beispiele einfügen</div> ====


<tt>'''nl'''</tt> gibt die Zeilen einer oder mehrerer Dateien (oder der Standardeingabe) mit Zeilennummern auf die Standardausgabe.  
<tt>'''nl'''</tt> gibt die Zeilen einer oder mehrerer Dateien (oder der Standardeingabe) mit Zeilennummern auf die Standardausgabe.  
Zeile 271: Zeile 261:
===== Optionen =====
===== Optionen =====


 
{|class="wikitable"  
{| style="border-spacing:0;margin:auto;width:17.501cm;"
|-
|-
| style="background-color:transparent;border-top:0.05pt solid #000000;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.349cm;padding-right:0.349cm;" | <tt>'''-h ''Stil'' '''</tt>
| | <tt>'''-h ''Stil'' '''</tt>
| style="border:0.05pt solid #000000;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.349cm;padding-right:0.349cm;" | bestimmt die Art der Zeilennumerierung für die Kopfzeile; das Nummerntrennzeichen wird auch den nicht numerierten Zeilen vorangestellt; als ''Stil'' werden folgende Zeichen erkannt  
| | bestimmt die Art der Zeilennumerierung für die Kopfzeile; das Nummerntrennzeichen wird auch den nicht numerierten Zeilen vorangestellt; als ''Stil'' werden folgende Zeichen erkannt  


a alle Zeilen  
a alle Zeilen  
Zeile 285: Zeile 274:
p '''''Ausdruck''''' nur Zeilen, in denen der reguläre ''Ausdruck'' vorkommt,
p '''''Ausdruck''''' nur Zeilen, in denen der reguläre ''Ausdruck'' vorkommt,
|-
|-
| style="background-color:transparent;border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.349cm;padding-right:0.349cm;" | <tt>'''-b ''Stil'' '''</tt>
| | <tt>'''-b ''Stil'' '''</tt>
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.349cm;padding-right:0.349cm;" | bestimmt die Art der Zeilennumerierung für den Körper  
| | bestimmt die Art der Zeilennumerierung für den Körper  
|-
|-
| style="background-color:transparent;border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.349cm;padding-right:0.349cm;" | <tt>'''-f ''Stil'' '''</tt>
| | <tt>'''-f ''Stil'' '''</tt>
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.349cm;padding-right:0.349cm;" | bestimmt die Art der Zeilennumerierung für den Fuß  
| | bestimmt die Art der Zeilennumerierung für den Fuß  
|-
|-
| style="background-color:transparent;border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.349cm;padding-right:0.349cm;" | <tt>'''-p '''</tt>
| | <tt>'''-p '''</tt>
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.349cm;padding-right:0.349cm;" | die Zeilen aller Seiten werden fortlaufend numeriert  
| | die Zeilen aller Seiten werden fortlaufend numeriert  
|-
|-
| style="background-color:transparent;border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.349cm;padding-right:0.349cm;" | <tt>'''-v ''Nummer'' '''</tt>
| | <tt>'''-v ''Nummer'' '''</tt>
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.349cm;padding-right:0.349cm;" | die erste Zeile jeder logischen Seite bekommt die angegebene Nummer  
| | die erste Zeile jeder logischen Seite bekommt die angegebene Nummer  
|-
|-
| style="background-color:transparent;border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.349cm;padding-right:0.349cm;" | <tt>'''-i ''Nummer'' '''</tt>
| | <tt>'''-i ''Nummer'' '''</tt>
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.349cm;padding-right:0.349cm;" | die Schrittweite für die Numerierung  
| | die Schrittweite für die Numerierung  
|-
|-
| style="background-color:transparent;border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.349cm;padding-right:0.349cm;" | <tt>'''-l ''Nummer'' '''</tt>
| | <tt>'''-l ''Nummer'' '''</tt>
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.349cm;padding-right:0.349cm;" | die angegebene Anzahl aufeinanderfolgender Leerzeilen werden als eine Zeile angesehen, und die letzte Zeile wird numeriert;  
| | die angegebene Anzahl aufeinanderfolgender Leerzeilen werden als eine Zeile angesehen, und die letzte Zeile wird numeriert;  


wenn weniger Leerzeilen in Folge auftreten, werden sie nicht numeriert;
wenn weniger Leerzeilen in Folge auftreten, werden sie nicht numeriert;
Zeile 307: Zeile 296:
Leerzeilen dürfen keine Leerzeichen oder Tabulatoren enthalten  
Leerzeilen dürfen keine Leerzeichen oder Tabulatoren enthalten  
|-
|-
| style="background-color:transparent;border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.349cm;padding-right:0.349cm;" | <tt>'''-s ''Zeichenkette'' '''</tt>
| | <tt>'''-s ''Zeichenkette'' '''</tt>
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.349cm;padding-right:0.349cm;" | setzt die ''Zeichenkette'' als Nummerntrennzeichen zwischen Zeilennummer und Text; Voreinstellung ist TAB  
| | setzt die ''Zeichenkette'' als Nummerntrennzeichen zwischen Zeilennummer und Text; Voreinstellung ist TAB  
|-
|-
| style="background-color:transparent;border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.349cm;padding-right:0.349cm;" | <tt>'''-w ''Nummer'' '''</tt>
| | <tt>'''-w ''Nummer'' '''</tt>
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.349cm;padding-right:0.349cm;" | die Zeilennummern erhalten die angegebene Anzahl Stellen; Voreinstellung ist 6  
| | die Zeilennummern erhalten die angegebene Anzahl Stellen; Voreinstellung ist 6  
|-
|-
| style="background-color:transparent;border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.349cm;padding-right:0.349cm;" | <tt>'''-n {ln, rn, rz} '''</tt>
| | <tt>'''-n {ln, rn, rz} '''</tt>
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.349cm;padding-right:0.349cm;" | die Zeilennummern werden in dem angegebenen Stil ausgegeben; dabei bedeutet  
| | die Zeilennummern werden in dem angegebenen Stil ausgegeben; dabei bedeutet  


ln linksbündig, ohne führende Nullen  
ln linksbündig, ohne führende Nullen  
Zeile 322: Zeile 311:
rz rechtsbündig, mit Nullen auf die volle Stellenzahl aufgefüllt  
rz rechtsbündig, mit Nullen auf die volle Stellenzahl aufgefüllt  
|-
|-
| style="background-color:transparent;border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.349cm;padding-right:0.349cm;" | <tt>'''-d ''zwei Zeichen'' '''</tt>
| | <tt>'''-d ''zwei Zeichen'' '''</tt>
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.349cm;padding-right:0.349cm;" | die zwei Zeichen werden zur Trennung von Kopf, Körper und Fußteil benutzt, Voreinstellung ist `\:'  
| | die zwei Zeichen werden zur Trennung von Kopf, Körper und Fußteil benutzt, Voreinstellung ist `\:'  
 


|-
|-
|}
|}
=== {{anchor|RefHeading25579109232536}} Aufbau der sed-Anweisungen ===
=== Aufbau der sed-Anweisungen ===


Aber wenn man ein paar grundlegende Dinge verstanden hat, ist es nicht schwierig. Die sed-Anweisungen werden i.A. von einfachen Hochkommas umschlossen.  
Aber wenn man ein paar grundlegende Dinge verstanden hat, ist es nicht schwierig. Die sed-Anweisungen werden i.A. von einfachen Hochkommas umschlossen.  


sed 'anweisung' < sed-test.txt
sed 'anweisung' < sed-test.txt


sed kann mehrere Anweisungen in einem Durchgang abarbeiten. In diesem Falle muss jedem Befehl die Option "-e" vorangestellt werden. Wenn nur eine Anweisung abgearbeitet werden soll, kann man "-e" weglassen.  
sed kann mehrere Anweisungen in einem Durchgang abarbeiten. In diesem Falle muss jedem Befehl die Option "-e" vorangestellt werden. Wenn nur eine Anweisung abgearbeitet werden soll, kann man "-e" weglassen.  


sed -e 'anweisung1' -e 'anweisung2' < sed-test.txt
sed -e 'anweisung1' -e 'anweisung2' < sed-test.txt


möglich, aber etwas unübersichtlicher ist auch diese Form:  
möglich, aber etwas unübersichtlicher ist auch diese Form:  


sed -e 'anweisung1; anweisung2' < sed-test.txt
sed -e 'anweisung1; anweisung2' < sed-test.txt


In vielen sed-Anweisungen kommt das Zeichen '/' vor. Es ist ein Begrenzungszeichen, also ein "delimiter". Eine Regular Expression, also ein Suchausdruck, wird durch zwei Schrägstriche begrenzt. Im folgende kürze ich "Regular Expression" durch "RE" ab.  
In vielen sed-Anweisungen kommt das Zeichen '/' vor. Es ist ein Begrenzungszeichen, also ein "delimiter". Eine Regular Expression, also ein Suchausdruck, wird durch zwei Schrägstriche begrenzt. Im folgende kürze ich "Regular Expression" durch "RE" ab.  
Zeile 353: Zeile 338:
* die RE "isst" wird durch "/" am Anfang und Ende eingegrenzt.
* die RE "isst" wird durch "/" am Anfang und Ende eingegrenzt.
* "/" ist also nichts anderes als ein Begrenzungszeichen, ähnlich wie Hochkommata
* "/" ist also nichts anderes als ein Begrenzungszeichen, ähnlich wie Hochkommata


Die vorige Anweisung ist unvollständig, da sie nur aus der RE '/isst/' besteht. sed muss noch mitgeteilt werden, wie mit dem Suchergebnis zu verfahren ist.  
Die vorige Anweisung ist unvollständig, da sie nur aus der RE '/isst/' besteht. sed muss noch mitgeteilt werden, wie mit dem Suchergebnis zu verfahren ist.  
Zeile 362: Zeile 343:
Hinter der durch die RE getroffenen Bereichsauswahl ist der Befehl anzugeben. Eine sed-Anweisung enthält also i.A. mindestens zwei Komponenten (die Bereichsauswahl kann in bestimmten Konstrukten fehlen): # Bereichsauswahl<br/>Auswahl der Zeilen, die bearbeitet werden sollen. Im vorigen Beispiel würde sich die Auswahl auf alle Zeilen beziehen, in denen "isst" vorkommt.
Hinter der durch die RE getroffenen Bereichsauswahl ist der Befehl anzugeben. Eine sed-Anweisung enthält also i.A. mindestens zwei Komponenten (die Bereichsauswahl kann in bestimmten Konstrukten fehlen): # Bereichsauswahl<br/>Auswahl der Zeilen, die bearbeitet werden sollen. Im vorigen Beispiel würde sich die Auswahl auf alle Zeilen beziehen, in denen "isst" vorkommt.
# Befehl<br/>Was soll mit den ausgewählten Zeilen passieren? Der einfachste Befehl lautet "p" (print), er gibt die selektierten Zeilen am Bildschirm aus.
# Befehl<br/>Was soll mit den ausgewählten Zeilen passieren? Der einfachste Befehl lautet "p" (print), er gibt die selektierten Zeilen am Bildschirm aus.


Das vorige Beispiel wird vervollständigt:  
Das vorige Beispiel wird vervollständigt:  


sed '/isst/p' < sed-test.txt
sed '/isst/p' < sed-test.txt


* Durchsuchen der Datei nach Zeilen, die "isst" enthalten
* Durchsuchen der Datei nach Zeilen, die "isst" enthalten
* Die selektierten Zeilen werden am Bildschirm ausgegeben
* Die selektierten Zeilen werden am Bildschirm ausgegeben
* "/" umschließt die RE, hat also mit dem Befehl "p" nichts zu tun.
* "/" umschließt die RE, hat also mit dem Befehl "p" nichts zu tun.


Leider liefert die sed-Anweisung ein unbefriedigendes Ergebnis, da alle Zeilen ausgegeben werden.  
Leider liefert die sed-Anweisung ein unbefriedigendes Ergebnis, da alle Zeilen ausgegeben werden.  
Zeile 382: Zeile 356:
Dies liegt an der Arbeitsweise von sed. Um das gewünschte Ergebnis zu erhalten, muss sed mit der Option "-n" aufgerufen werden:  
Dies liegt an der Arbeitsweise von sed. Um das gewünschte Ergebnis zu erhalten, muss sed mit der Option "-n" aufgerufen werden:  


sed -n '/isst/p' < sed-test.txt''' '''  
sed -n '/isst/p' < sed-test.txt''' '''  
* beim p-Befehl immer die Option "-n" verwenden!
* beim p-Befehl immer die Option "-n" verwenden!
* aufgrund der Option "-n" werden nur die Zeilen ausgegeben, in denen "isst" vorkommt.
* aufgrund der Option "-n" werden nur die Zeilen ausgegeben, in denen "isst" vorkommt.


Wenn man die Option "-e" verwendet, muss beachtet weden, dass "-n" vor "-e" steht.  
Wenn man die Option "-e" verwendet, muss beachtet weden, dass "-n" vor "-e" steht.  
Zeile 395: Zeile 365:
* "-e" muss hinter "-n" stehen!
* "-e" muss hinter "-n" stehen!


== Dateizeilen ausgeben ==


 
=== Ausgabe [p] ===
== {{anchor|RefHeading2661939995267}} Dateizeilen ausgeben ==
 
=== {{anchor|RefHeading3008181082722535}} Ausgabe [p] ===


Zunächst wenden wir das Kommando p auf die ersten 3 Zeilen der Datei an:  
Zunächst wenden wir das Kommando p auf die ersten 3 Zeilen der Datei an:  


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


Offensichtlich zeigt der Stream Editor etwas mehr an, als uns lieb ist; er gibt einfach die gesamte Datei aus und wiederholt nur die Zeilen, die durch das Kommando »1,3p« bearbeitet wurden.  
Offensichtlich zeigt der Stream Editor etwas mehr an, als uns lieb ist; er gibt einfach die gesamte Datei aus und wiederholt nur die Zeilen, die durch das Kommando »1,3p« bearbeitet wurden.  


=== {{anchor|RefHeadingToc36301725578261}} Mehrfache Ausgaben unterbinden [-n] ===
=== Mehrfache Ausgaben unterbinden [-n] ===


Um solche »überflüssigen« Ausgaben zu unterbinden, muss die Option »-n« verwendet werden:  
Um solche »überflüssigen« Ausgaben zu unterbinden, muss die Option »-n« verwendet werden:  


'''sed -n '1,3p' test.txt'''
'''sed -n '1,3p' test.txt'''
  1       Der Aufruf des Stream Editors besitzt immer das Format:
  1 Der Aufruf des Stream Editors besitzt immer das Format:
  2      
  2  
  3             sed 'Kommando' Dateiname
  3 sed 'Kommando' Dateiname


Bei der Adressierung mittels regulärer Ausdrücke müssen diese in Schrägstriche (Slashes) eingeschlossen sein:  
Bei der Adressierung mittels regulärer Ausdrücke müssen diese in Schrägstriche (Slashes) eingeschlossen sein:  


'''sed -n '/RegEx/,/RegEx/p' test.txt'''
'''sed -n '/RegEx/,/RegEx/p' test.txt'''
  13             RegEx   Zeilen, die den Regulären Ausdruck enthalten
  13 RegEx Zeilen, die den Regulären Ausdruck enthalten
  14             1, RegEx               Von Zeile 1 bis zur ersten Zeile, die RegEx enthält
  14 1, RegEx Von Zeile 1 bis zur ersten Zeile, die RegEx enthält


=== {{anchor|RefHeadingToc33331725578261}} Printing Operation in Sed ===
=== Printing Operation in Sed ===


<span style="color:#0000ff;">Linux Sed command allows you to print only specific lines based on the line number or pattern matches. </span><span style="color:#0000ff;">'''“p”'''</span><span style="color:#0000ff;"> is a command for printing the data from the pattern buffer.</span>
<span > is a command for printing the data from the pattern buffer.</span>


<div style="color:#0000ff;">To suppress automatic printing of pattern space use -n command with sed. sed -n option will not print anything, unless an explicit request to print is found.</div>
<div >To suppress automatic printing of pattern space use -n command with sed. sed -n option will not print anything, unless an explicit request to print is found.</div>


<div >Syntax:</div>
<div ><nowiki># sed -n 'ADDRESS'p filename</nowiki></div>


<div style="color:#0000ff;">Syntax:</div>
<div ><nowiki># sed -n '/PATTERN/p' filename</nowiki></div>
<div style="color:#0000ff;"><nowiki># sed -n 'ADDRESS'p filename</nowiki></div>


<div style="color:#0000ff;"><nowiki># sed -n '/PATTERN/p' filename</nowiki></div>
<div >Let us first create thegeekstuff.txt file that will be used in all the examples mentioned below.</div>


<div style="color:#0000ff;">Let us first create thegeekstuff.txt file that will be used in all the examples mentioned below.</div>
<div ><nowiki># cat thegeekstuff.txt</nowiki></div>
<div >1. Linux - Sysadmin, Scripting etc.</div>
<div >2. Databases - Oracle, mySQL etc.</div>
<div >3. Hardware</div>
<div >4. Security (Firewall, Network, Online Security etc)</div>
<div >5. Storage</div>
<div >6. Cool gadgets and websites</div>
<div >7. Productivity (Too many technologies to explore, not much time available)</div>
<div >8. Website Design</div>
<div >9. Software Development</div>
<div >10.Windows- Sysadmin, reboot etc.</div>


<div style="color:#0000ff;"><nowiki># cat thegeekstuff.txt</nowiki></div>
== Adressierung ==
<div style="color:#0000ff;">1. Linux - Sysadmin, Scripting etc.</div>
<div style="color:#0000ff;">2. Databases - Oracle, mySQL etc.</div>
<div style="color:#0000ff;">3. Hardware</div>
<div style="color:#0000ff;">4. Security (Firewall, Network, Online Security etc)</div>
<div style="color:#0000ff;">5. Storage</div>
<div style="color:#0000ff;">6. Cool gadgets and websites</div>
<div style="color:#0000ff;">7. Productivity (Too many technologies to explore, not much time available)</div>
<div style="color:#0000ff;">8. Website Design</div>
<div style="color:#0000ff;">9. Software Development</div>
<div style="color:#0000ff;">10.Windows- Sysadmin, reboot etc.</div>
 
== {{anchor|RefHeading25581109232536}} Adressierung ==


Es ist möglich, bestimmte Zeilen explizit auszuwählen, also z.B. "Zeile 1", "Zeile 1-2", "letzte Zeile" usw. In diesem Falle wird die Bereichsauswahl direkt angegeben, sie steht also nicht zwischen "/" wie bei RE-Ausdrücken.  
Es ist möglich, bestimmte Zeilen explizit auszuwählen, also z.B. "Zeile 1", "Zeile 1-2", "letzte Zeile" usw. In diesem Falle wird die Bereichsauswahl direkt angegeben, sie steht also nicht zwischen "/" wie bei RE-Ausdrücken.  
Zeile 471: Zeile 438:
Der Befehl 'p' steht direkt hinter der Bereichsauswahl.  
Der Befehl 'p' steht direkt hinter der Bereichsauswahl.  


=== {{anchor|RefHeadingToc27421725578261}} Using Address and Patterns ===
=== Using Address and Patterns ===
 
<span style="color:#0000ff;">In the previous sed tutorial we discussed about </span>[http://www.thegeekstuff.com/2009/09/unix-sed-tutorial-printing-file-lines-using-address-and-patterns/ Unix sed command basics and printing lines]<span style="color:#0000ff;"> from a file using sed address and patterns.</span>


<div style="color:#0000ff;">In this article, let us review how to delete lines from a file using address and patterns with 8 awesome examples.</div>* <div style="color:#0000ff;">“p” command prints the buffer (remember to use -n option with “p”) </div>
<span > from a file using sed address and patterns.</span>
* <span style="color:#0000ff;">“d” command is just opposite, its for deletion. </span><span style="color:#0000ff;">'''‘d’'''</span><span style="color:#0000ff;"> will delete the pattern space buffer and immediately starts the next cycle. </span><br/>


<div >“p” command prints the buffer (remember to use -n option with “p”) </div>
* <span > will delete the pattern space buffer and immediately starts the next cycle. </span><br/>


==== Syntax ====
==== Syntax ====


* <span style="color:#0000ff;"><tt>sed 'ADDRESS'd filename</tt></span>
* <span ><tt>sed 'ADDRESS'd filename</tt></span>
* <span style="color:#0000ff;"><tt>sed /PATTERN/d filename</tt></span>
* <span ><tt>sed /PATTERN/d filename</tt></span>
 


<div ></div>


<div style="color:#0000ff;"></div>
<div >Syntax for ADDRESSES and PATTERNS given in the printing is applicable for deletion also, except -n option. (-n only to suppress printing pattern buffer, can be used with “p” command )</div>


<div style="color:#0000ff;">Syntax for ADDRESSES and PATTERNS given in the printing is applicable for deletion also, except -n option. (-n only to suppress printing pattern buffer, can be used with “p” command )</div>
<div >Let us first creates thegeekstuff.txt file that will be used in all the examples mentioned below.</div>


<div ><nowiki># cat thegeekstuff.txt</nowiki></div>
<div >1. Linux - Sysadmin, Scripting etc.</div>
<div >2. Databases - Oracle, mySQL etc.</div>
<div >3. Hardware</div>
<div >4. Security (Firewall, Network, Online Security etc)</div>
<div >5. Storage</div>
<div >6. Cool gadgets and websites</div>
<div >7. Productivity (Too many technologies to explore, not much time available)</div>
<div >8. Website Design</div>
<div >9. Software Development</div>
<div >10.Windows- Sysadmin, reboot etc.</div>


<div style="color:#0000ff;">Let us first creates thegeekstuff.txt file that will be used in all the examples mentioned below.</div>
=== ADDRESS Format Beispiele ===
 
<div style="color:#0000ff;"><nowiki># cat thegeekstuff.txt</nowiki></div>
<div style="color:#0000ff;">1. Linux - Sysadmin, Scripting etc.</div>
<div style="color:#0000ff;">2. Databases - Oracle, mySQL etc.</div>
<div style="color:#0000ff;">3. Hardware</div>
<div style="color:#0000ff;">4. Security (Firewall, Network, Online Security etc)</div>
<div style="color:#0000ff;">5. Storage</div>
<div style="color:#0000ff;">6. Cool gadgets and websites</div>
<div style="color:#0000ff;">7. Productivity (Too many technologies to explore, not much time available)</div>
<div style="color:#0000ff;">8. Website Design</div>
<div style="color:#0000ff;">9. Software Development</div>
<div style="color:#0000ff;">10.Windows- Sysadmin, reboot etc.</div>
 
=== {{anchor|RefHeadingToc32101725578261}} ADDRESS Format Beispiele ===


==== NUMBER ====
==== NUMBER ====
Zeile 518: Zeile 481:
3. Hardware
3. Hardware


===== {{anchor|RefHeadingToc28281725578261}} Erste Zeile ausgeben =====
===== Erste Zeile ausgeben =====


sed -n '1p' < sed-test.txt
sed -n '1p' < sed-test.txt  


Option "-n" nicht vergessen!
Option "-n" nicht vergessen!
Zeile 526: Zeile 489:
==== NUMBER1~NUMBER2 ====
==== NUMBER1~NUMBER2 ====


<div style="color:#0000ff;">M~N with “p” command prints every Nth line starting from line M.</div>
<div >M~N with “p” command prints every Nth line starting from line M.</div>


<span style="color:#0000ff;">'''<nowiki># sed -n ‘M~N’p filename</nowiki>'''</span>
<span >'''<nowiki># sed -n ‘M~N’p filename</nowiki>'''</span>


<div style="color:#0000ff;">For example, 3~2p prints every 2nd line starting from 3rd line as shown below.</div>
<div >For example, 3~2p prints every 2nd line starting from 3rd line as shown below.</div>


<div style="color:#0000ff;"><nowiki># sed -n '3~2'p thegeekstuff.txt</nowiki></div>
<div ><nowiki># sed -n '3~2'p thegeekstuff.txt</nowiki></div>
<div style="color:#0000ff;">3. Hardware</div>
<div >3. Hardware</div>
<div style="color:#0000ff;">5. Storage</div>
<div >5. Storage</div>
<div style="color:#0000ff;">7. Productivity (Too many technologies to explore, not much time available)</div>
<div >7. Productivity (Too many technologies to explore, not much time available)</div>
<div style="color:#0000ff;">9. Software Development</div>
<div >9. Software Development</div>


==== START, END ====
==== START, END ====


<div style="color:#0000ff;">M,N with “p” command prints Mth line to Nth line.</div>
<div >M,N with “p” command prints Mth line to Nth line.</div>


<span style="color:#0000ff;">'''<nowiki># sed -n ‘M,N’p filename</nowiki>'''</span>
<span >'''<nowiki># sed -n ‘M,N’p filename</nowiki>'''</span>


<div style="color:#0000ff;">For example, 4,8p prints from 4th line to 8th line from input file thegeekstuff.txt</div>
<div >For example, 4,8p prints from 4th line to 8th line from input file thegeekstuff.txt</div>


<div style="color:#0000ff;"><nowiki># sed -n '4,8'p thegeekstuff.txt</nowiki></div>
<div ><nowiki># sed -n '4,8'p thegeekstuff.txt</nowiki></div>
<div style="color:#0000ff;">4. Security (Firewall, Network, Online Security etc)</div>
<div >4. Security (Firewall, Network, Online Security etc)</div>
<div style="color:#0000ff;">5. Storage</div>
<div >5. Storage</div>
<div style="color:#0000ff;">6. Cool gadgets and websites</div>
<div >6. Cool gadgets and websites</div>
<div style="color:#0000ff;">7. Productivity (Too many technologies to explore, not much time available)</div>
<div >7. Productivity (Too many technologies to explore, not much time available)</div>
<div style="color:#0000ff;">8. Website Design</div>
<div >8. Website Design</div>


==== ‘$’ Last Line ====
==== ‘$’ Last Line ====


<div style="color:#0000ff;">$ with “p” command matches only the last line from the input.</div>
<div >$ with “p” command matches only the last line from the input.</div>


<span style="color:#0000ff;">'''<nowiki># sed -n ‘$’p filename</nowiki>'''</span>
<span >'''<nowiki># sed -n ‘$’p filename</nowiki>'''</span>


<div style="color:#0000ff;">For example, $p prints only the last line as shown below.</div>
<div >For example, $p prints only the last line as shown below.</div>


<div style="color:#0000ff;"><nowiki># sed -n '$'p thegeekstuff.txt</nowiki></div>
<div ><nowiki># sed -n '$'p thegeekstuff.txt</nowiki></div>
<div style="color:#0000ff;">10.Windows- Sysadmin, reboot etc.</div>
<div >10.Windows- Sysadmin, reboot etc.</div>


==== NUMBER,$ ====
==== NUMBER,$ ====


<div style="color:#0000ff;">N,$ with “p” command prints from Nth line to end of file.</div>
<div >N,$ with “p” command prints from Nth line to end of file.</div>


<span style="color:#0000ff;">'''<nowiki># sed -n ‘N,$p’ filename</nowiki>'''</span>
<span >'''<nowiki># sed -n ‘N,$p’ filename</nowiki>'''</span>


<div style="color:#0000ff;">For example 4,$p prints from 4th line to end of file.</div>
<div >For example 4,$p prints from 4th line to end of file.</div>


<div style="color:#0000ff;"><nowiki># sed -n '4,$p' thegeekstuff.txt</nowiki></div>
<div ><nowiki># sed -n '4,$p' thegeekstuff.txt</nowiki></div>
<div style="color:#0000ff;">4. Security (Firewall, Network, Online Security etc)</div>
<div >4. Security (Firewall, Network, Online Security etc)</div>
<div style="color:#0000ff;">5. Storage</div>
<div >5. Storage</div>
<div style="color:#0000ff;">6. Cool gadgets and websites</div>
<div >6. Cool gadgets and websites</div>
<div style="color:#0000ff;">7. Productivity (Too many technologies to explore, not much time available)</div>
<div >7. Productivity (Too many technologies to explore, not much time available)</div>
<div style="color:#0000ff;">8. Website Design</div>
<div >8. Website Design</div>
<div style="color:#0000ff;">9. Software Development</div>
<div >9. Software Development</div>
<div style="color:#0000ff;">10.Windows- Sysadmin, reboot etc.</div>
<div >10.Windows- Sysadmin, reboot etc.</div>


===== {{anchor|RefHeadingToc28301725578261}} Letzte Zeile ausgeben =====
===== Letzte Zeile ausgeben =====


sed -n '$p' < sed-test.txt
sed -n '$p' < sed-test.txt  


=== {{anchor|RefHeadingToc32121725578261}} PATTERN Format Beispiele ===
=== PATTERN Format Beispiele ===


==== PATTERN ====
==== PATTERN ====


<div style="color:#0000ff;">PATTERN could be unix regular expression. The below command prints only the line which matches the given pattern.</div>
<div >PATTERN could be unix regular expression. The below command prints only the line which matches the given pattern.</div>


<span style="color:#0000ff;">'''<nowiki># sed -n /PATTERN/p filename</nowiki>'''</span>
<span >'''<nowiki># sed -n /PATTERN/p filename</nowiki>'''</span>


<div style="color:#0000ff;">For example, following prints the line only which matches the pattern “Sysadmin”.</div>
<div >For example, following prints the line only which matches the pattern “Sysadmin”.</div>


<div style="color:#0000ff;"><nowiki># sed -n /Sysadmin/p thegeekstuff.txt</nowiki></div>
<div ><nowiki># sed -n /Sysadmin/p thegeekstuff.txt</nowiki></div>
<div style="color:#0000ff;">1. Linux - Sysadmin, Scripting etc.</div>
<div >1. Linux - Sysadmin, Scripting etc.</div>
<div style="color:#0000ff;">10.Windows- Sysadmin, reboot etc.</div>
<div >10.Windows- Sysadmin, reboot etc.</div>


==== /PATTERN/,ADDRESS ====
==== /PATTERN/,ADDRESS ====


<span style="color:#0000ff;">'''<nowiki># sed -n ‘/PATTERN/,Np’ filename</nowiki>'''</span>
<span >'''<nowiki># sed -n ‘/PATTERN/,Np’ filename</nowiki>'''</span>


<div style="color:#0000ff;">For example, following prints lines which matches the pattern to Nth line, from input. 3rd line matches the pattern “Hardware”, so it prints from 3rd line to 6th line.</div>
<div >For example, following prints lines which matches the pattern to Nth line, from input. 3rd line matches the pattern “Hardware”, so it prints from 3rd line to 6th line.</div>


<div style="color:#0000ff;"><nowiki># sed -n '/Hardware/,6p' thegeekstuff.txt</nowiki></div>
<div ><nowiki># sed -n '/Hardware/,6p' thegeekstuff.txt</nowiki></div>
<div style="color:#0000ff;">3. Hardware</div>
<div >3. Hardware</div>
<div style="color:#0000ff;">4. Security (Firewall, Network, Online Security etc)</div>
<div >4. Security (Firewall, Network, Online Security etc)</div>
<div style="color:#0000ff;">5. Storage</div>
<div >5. Storage</div>
<div style="color:#0000ff;">6. Cool gadgets and websites</div>
<div >6. Cool gadgets and websites</div>


==== ADDRESS,/PATTERN/ ====
==== ADDRESS,/PATTERN/ ====


<div style="color:#0000ff;">It prints from the Nth line of the input, to the line which matches the pattern. If the pattern doesnt match, it prints upto end of the input.</div>
<div >It prints from the Nth line of the input, to the line which matches the pattern. If the pattern doesnt match, it prints upto end of the input.</div>


<span style="color:#0000ff;">'''<nowiki># sed -n ‘N,/PATTERN/p’ filename</nowiki>'''</span>
<span >'''<nowiki># sed -n ‘N,/PATTERN/p’ filename</nowiki>'''</span>


<div style="color:#0000ff;">For example, 4th line matches the pattern “Security”, so it prints from 3rd line to 4th line.</div>
<div >For example, 4th line matches the pattern “Security”, so it prints from 3rd line to 4th line.</div>


<div style="color:#0000ff;"><nowiki># sed -n '3,/Security/p' thegeekstuff.txt</nowiki></div>
<div ><nowiki># sed -n '3,/Security/p' thegeekstuff.txt</nowiki></div>
<div style="color:#0000ff;">3. Hardware</div>
<div >3. Hardware</div>
<div style="color:#0000ff;">4. Security (Firewall, Network, Online Security etc)</div>
<div >4. Security (Firewall, Network, Online Security etc)</div>


==== /PATTERN/,$ ====
==== /PATTERN/,$ ====


<div style="color:#0000ff;">It prints from the line matches the given pattern to end of file.</div>
<div >It prints from the line matches the given pattern to end of file.</div>


<span style="color:#0000ff;">'''<nowiki># sed -n ‘/PATTERN/,$p’ filename</nowiki>'''</span>
<span >'''<nowiki># sed -n ‘/PATTERN/,$p’ filename</nowiki>'''</span>


<div style="color:#0000ff;"><nowiki># sed -n '/Website/,$p' thegeekstuff.txt</nowiki></div>
<div ><nowiki># sed -n '/Website/,$p' thegeekstuff.txt</nowiki></div>
<div style="color:#0000ff;">8. Website Design</div>
<div >8. Website Design</div>
<div style="color:#0000ff;">9. Software Development</div>
<div >9. Software Development</div>
<div style="color:#0000ff;">10.Windows- Sysadmin, reboot etc.</div>
<div >10.Windows- Sysadmin, reboot etc.</div>


==== /PATTERN/,+N ====
==== /PATTERN/,+N ====


<div style="color:#0000ff;">It prints the lines which matches the pattern and next N lines following the matched line.</div>
<div >It prints the lines which matches the pattern and next N lines following the matched line.</div>


<span style="color:#0000ff;">'''<nowiki># sed -n ‘/PATTERN/,+Np’ filename</nowiki>'''</span>
<span >'''<nowiki># sed -n ‘/PATTERN/,+Np’ filename</nowiki>'''</span>


<div style="color:#0000ff;">For example, following prints the 5th line which matches the pattern /Storage/ and next two lines following /Storage/.</div>
<div >For example, following prints the 5th line which matches the pattern /Storage/ and next two lines following /Storage/.</div>


<div style="color:#0000ff;"><nowiki># sed -n '/Storage/,+2p' thegeekstuff.txt</nowiki></div>
<div ><nowiki># sed -n '/Storage/,+2p' thegeekstuff.txt</nowiki></div>
<div style="color:#0000ff;">5. Storage</div>
<div >5. Storage</div>
<div style="color:#0000ff;">6. Cool gadgets and websites</div>
<div >6. Cool gadgets and websites</div>
<div style="color:#0000ff;">7. Productivity (Too many technologies to explore, not much time available)</div>
<div >7. Productivity (Too many technologies to explore, not much time available)</div>


==== /PATTERN/,/PATTERN/ ====
==== /PATTERN/,/PATTERN/ ====


<div style="color:#0000ff;">Prints the section of file between two regular expression (including the matched line ).</div>
<div >Prints the section of file between two regular expression (including the matched line ).</div>


<span style="color:#0000ff;">'''<nowiki># sed -n ‘/P1/,/P2/p’ filename</nowiki>'''</span>
<span >'''<nowiki># sed -n ‘/P1/,/P2/p’ filename</nowiki>'''</span>


<div style="color:#0000ff;">For example, 5th line matches “Storage” and 8th line matches “Design”, so it prints 5th to 8th.</div>
<div >For example, 5th line matches “Storage” and 8th line matches “Design”, so it prints 5th to 8th.</div>


<div style="color:#0000ff;"><nowiki># sed -n '/Storage/,/Design/p' thegeekstuff.txt</nowiki></div>
<div ><nowiki># sed -n '/Storage/,/Design/p' thegeekstuff.txt</nowiki></div>
<div style="color:#0000ff;">5. Storage</div>
<div >5. Storage</div>
<div style="color:#0000ff;">6. Cool gadgets and websites</div>
<div >6. Cool gadgets and websites</div>
<div style="color:#0000ff;">7. Productivity (Too many technologies to explore, not much time available)</div>
<div >7. Productivity (Too many technologies to explore, not much time available)</div>
<div style="color:#0000ff;">8. Website Design</div>
<div >8. Website Design</div>


=== {{anchor|RefHeading25589109232536}} Besondere Zeichen ===
=== Besondere Zeichen ===


==== Negation ====
==== Negation ====


Das Ausrufezeichen ("!") hinter der Bereichsauswahl bewirkt eine Negation
Das Ausrufezeichen ("!") hinter der Bereichsauswahl bewirkt eine Negation


sed '/isst/!d' < sed-test.txt  
sed '/isst/!d' < sed-test.txt  
* Zeilen, die "isst" nicht enthalten, werden nicht ausgegeben<br/>
* Zeilen, die "isst" nicht enthalten, werden nicht ausgegeben<br/>


 
sed -n '1!p' < sed-test.txt  
sed -n '1!p'   < sed-test.txt  
* alle Zeilen außer Zeile 1 werden ausgegeben
* alle Zeilen außer Zeile 1 werden ausgegeben


 
==== $-Zeichen: letztes Element ====
 
==== $-Zeichen: letztes Element ====


Das $-Zeichen steht bei der Bereichsauswahl für "letzte Zeile":  
Das $-Zeichen steht bei der Bereichsauswahl für "letzte Zeile":  
Zeile 682: Zeile 642:
sed -n '$p' < sed-test.txt  
sed -n '$p' < sed-test.txt  
* letzte Zeile ausgeben
* letzte Zeile ausgeben


In einer RE steht das $-Zeichen für "Zeilenende"
In einer RE steht das $-Zeichen für "Zeilenende"
Zeile 691: Zeile 647:
sed -n '/Zeile$/p' < sed-test.txt
sed -n '/Zeile$/p' < sed-test.txt
* Zeilen ausgeben, in denen "Zeile" am Ende steht
* Zeilen ausgeben, in denen "Zeile" am Ende steht


Möchte man dem Zeilenende eine Zeichenkette anhängen, genügt ein $ als Suchmuster:  
Möchte man dem Zeilenende eine Zeichenkette anhängen, genügt ein $ als Suchmuster:  
Zeile 701: Zeile 653:
* Jede Zeile endet mit ' und Schluss!'
* Jede Zeile endet mit ' und Schluss!'


 
==== ^ - Zeichen ====
 
==== ^ - Zeichen ====


Das ^-Zeichen steht in einer RE für Zeilenanfang:  
Das ^-Zeichen steht in einer RE für Zeilenanfang:  
Zeile 709: Zeile 659:
sed -n '/^Hier/p' < sed-test.txt
sed -n '/^Hier/p' < sed-test.txt
* Zeilen ausgeben, in denen "Hier" am Anfang steht<br/>
* Zeilen ausgeben, in denen "Hier" am Anfang steht<br/>


Innerhalb einer Zeichenklasse in einer RE steht es für Verneinung.  
Innerhalb einer Zeichenklasse in einer RE steht es für Verneinung.  
Zeile 715: Zeile 664:
sed -n '/F[^e]hler/p' < sed-test.txt  
sed -n '/F[^e]hler/p' < sed-test.txt  
* Zeilen ausgeben, in denen das Wort "F.hler" vorkommt, wobei der 2. Buchstabe kein "e" sein darf<br/>
* Zeilen ausgeben, in denen das Wort "F.hler" vorkommt, wobei der 2. Buchstabe kein "e" sein darf<br/>


Möchte man dem Zeilenanfang eine Zeichenkette voranstellen genügt ein ^ als Suchmuster:  
Möchte man dem Zeilenanfang eine Zeichenkette voranstellen genügt ein ^ als Suchmuster:  
Zeile 722: Zeile 670:
* Jede Zeile beginnt mit 'Am Anfang stand '
* Jede Zeile beginnt mit 'Am Anfang stand '


== Zeilen löschen ==


 
=== Löschen [d] ===
== {{anchor|RefHeading14699762120244}} Zeilen löschen ==
 
=== {{anchor|RefHeading3008201082722535}} Löschen [d] ===


Der nachfolgende Aufruf löscht alle Zeilen ab der (einschließlich) 4. bis zum Dateiende:  
Der nachfolgende Aufruf löscht alle Zeilen ab der (einschließlich) 4. bis zum Dateiende:  


'''sed '4,$d' test.txt'''
'''sed '4,$d' test.txt'''
  1       Der Aufruf des Stream Editors besitzt immer das Format:
  1 Der Aufruf des Stream Editors besitzt immer das Format:
  2      
  2  
  3             sed 'Kommando' Dateiname
  3 sed 'Kommando' Dateiname


Das Entfernen aller Zeilen, die mit einem Leerzeichen beginnen, erledigt dieser Aufruf:  
Das Entfernen aller Zeilen, die mit einem Leerzeichen beginnen, erledigt dieser Aufruf:  


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


Der delete-Befehl ist die Umkehrung des print-Befehls: Die bei der Bereichsauswahl (mittels RE oder explizit) selektierten Zeilen werden "gelöscht", also nicht ausgegeben.  
Der delete-Befehl ist die Umkehrung des print-Befehls: Die bei der Bereichsauswahl (mittels RE oder explizit) selektierten Zeilen werden "gelöscht", also nicht ausgegeben.  


sed '/isst/d' < sed-test.txt
sed '/isst/d' < sed-test.txt
* Zeilen, die "isst" enthalten, werden nicht ausgegeben
* Zeilen, die "isst" enthalten, werden nicht ausgegeben


 
sed '3d' < sed-test.txt
 
 
 
sed '3d'     < sed-test.txt
* die dritte Zeile wird nicht ausgegeben
* die dritte Zeile wird nicht ausgegeben


=== Beispiele ===


==== Lösche die Nte Zeile ====


=== {{anchor|RefHeadingToc35311725578261}} Beispiele ===
<div >‘Nd’ deletes the Nth line and prints the other lines.</div>


==== {{anchor|RefHeadingToc27441725578261}} Lösche die Nte Zeile ====
<span >'''sed ‘Nd’ filename'''</span>


<div style="color:#0000ff;">‘Nd’ deletes the Nth line and prints the other lines.</div>
<div >It reads the first line and places in its pattern buffer. </div>
* <div >Check whether supplied command is true for this line, if true, deletes pattern space buffer and starts next cycle. i.e Read next line. </div>
* <div >If supplied command doesnt true, as its normal behaviour it prints the content of the pattern space buffer. </div>


<span style="color:#0000ff;">'''sed ‘Nd’ filename'''</span>
<div >For example, 3d deletes 3rd line and prints other lines as shown below.</div>


<div style="color:#0000ff;">As per sed methodology,</div>* <div style="color:#0000ff;">It reads the first line and places in its pattern buffer. </div>
<div >sed 3d thegeekstuff.txt</div>
* <div style="color:#0000ff;">Check whether supplied command is true for this line, if true, deletes pattern space buffer and starts next cycle. i.e Read next line. </div>
<div >1. Linux - Sysadmin, Scripting etc.</div>
* <div style="color:#0000ff;">If supplied command doesnt true, as its normal behaviour it prints the content of the pattern space buffer. </div>
<div >2. Databases - Oracle, mySQL etc.</div>
<div >4. Security (Firewall, Network, Online Security etc)</div>
<div >5. Storage</div>
<div >6. Cool gadgets and websites</div>
<div >7. Productivity (Too many technologies to explore, not much time available)</div>
<div >8. Website Design</div>
<div >9. Software Development</div>
<div >10.Windows- Sysadmin, reboot etc.</div>


==== Delete Starting from 3rd line and every 2nd line from there. ====


<div >sed '3~2d' thegeekstuff.txt</div>
<div >1. Linux - Sysadmin, Scripting etc.</div>
<div >2. Databases - Oracle, mySQL etc.</div>
<div >4. Security (Firewall, Network, Online Security etc)</div>
<div >6. Cool gadgets and websites</div>
<div >8. Website Design</div>
<div >10.Windows- Sysadmin, reboot etc.</div>


<div style="color:#0000ff;">For example, 3d deletes 3rd line and prints other lines as shown below.</div>
==== Delete from 4th to 8th line from file. ====


<div style="color:#0000ff;">sed 3d thegeekstuff.txt</div>
<div >sed '4,8d' thegeekstuff.txt</div>
<div style="color:#0000ff;">1. Linux - Sysadmin, Scripting etc.</div>
<div >1. Linux - Sysadmin, Scripting etc.</div>
<div style="color:#0000ff;">2. Databases - Oracle, mySQL etc.</div>
<div >2. Databases - Oracle, mySQL etc.</div>
<div style="color:#0000ff;">4. Security (Firewall, Network, Online Security etc)</div>
<div >3. Hardware</div>
<div style="color:#0000ff;">5. Storage</div>
<div >9. Software Development</div>
<div style="color:#0000ff;">6. Cool gadgets and websites</div>
<div >10.Windows- Sysadmin, reboot etc.</div>
<div style="color:#0000ff;">7. Productivity (Too many technologies to explore, not much time available)</div>
<div style="color:#0000ff;">8. Website Design</div>
<div style="color:#0000ff;">9. Software Development</div>
<div style="color:#0000ff;">10.Windows- Sysadmin, reboot etc.</div>


==== {{anchor|RefHeadingToc27461725578261}} Delete Starting from 3rd line and every 2nd line from there. ====
==== Delete the last line from input. ====


<div style="color:#0000ff;">sed '3~2d' thegeekstuff.txt</div>
<div >sed '$d' thegeekstuff.txt</div>
<div style="color:#0000ff;">1. Linux - Sysadmin, Scripting etc.</div>
<div >1. Linux - Sysadmin, Scripting etc.</div>
<div style="color:#0000ff;">2. Databases - Oracle, mySQL etc.</div>
<div >2. Databases - Oracle, mySQL etc.</div>
<div style="color:#0000ff;">4. Security (Firewall, Network, Online Security etc)</div>
<div >3. Hardware</div>
<div style="color:#0000ff;">6. Cool gadgets and websites</div>
<div >4. Security (Firewall, Network, Online Security etc)</div>
<div style="color:#0000ff;">8. Website Design</div>
<div >5. Storage</div>
<div style="color:#0000ff;">10.Windows- Sysadmin, reboot etc.</div>
<div >6. Cool gadgets and websites</div>
<div >7. Productivity (Too many technologies to explore, not much time available)</div>
<div >8. Website Design</div>
<div >9. Software Development</div>


==== {{anchor|RefHeadingToc27481725578261}} Delete from 4th to 8th line from file. ====
==== Delete the line which matches the given pattern from input. ====


<div style="color:#0000ff;">sed '4,8d' thegeekstuff.txt</div>
<div >For example, the below command deletes the line which matches with “Sysadmin”.</div>
<div style="color:#0000ff;">1. Linux - Sysadmin, Scripting etc.</div>
<div style="color:#0000ff;">2. Databases - Oracle, mySQL etc.</div>
<div style="color:#0000ff;">3. Hardware</div>
<div style="color:#0000ff;">9. Software Development</div>
<div style="color:#0000ff;">10.Windows- Sysadmin, reboot etc.</div>


==== {{anchor|RefHeadingToc27501725578261}} Delete the last line from input. ====
<div >sed /Sysadmin/d thegeekstuff.txt</div>
<div >2. Databases - Oracle, mySQL etc.</div>
<div >3. Hardware</div>
<div >4. Security (Firewall, Network, Online Security etc)</div>
<div >5. Storage</div>
<div >6. Cool gadgets and websites</div>
<div >7. Productivity (Too many technologies to explore, not much time available)</div>
<div >8. Website Design</div>
<div >9. Software Development</div>


<div style="color:#0000ff;">sed '$d' thegeekstuff.txt</div>
==== Deletes the line from which matches the given pattern to end of the file. ====
<div style="color:#0000ff;">1. Linux - Sysadmin, Scripting etc.</div>
<div style="color:#0000ff;">2. Databases - Oracle, mySQL etc.</div>
<div style="color:#0000ff;">3. Hardware</div>
<div style="color:#0000ff;">4. Security (Firewall, Network, Online Security etc)</div>
<div style="color:#0000ff;">5. Storage</div>
<div style="color:#0000ff;">6. Cool gadgets and websites</div>
<div style="color:#0000ff;">7. Productivity (Too many technologies to explore, not much time available)</div>
<div style="color:#0000ff;">8. Website Design</div>
<div style="color:#0000ff;">9. Software Development</div>


==== {{anchor|RefHeadingToc27521725578261}} Delete the line which matches the given pattern from input. ====
<div >sed '/Website/,$d' thegeekstuff.txt</div>
<div >1. Linux - Sysadmin, Scripting etc.</div>
<div >2. Databases - Oracle, mySQL etc.</div>
<div >3. Hardware</div>
<div >4. Security (Firewall, Network, Online Security etc)</div>
<div >5. Storage</div>
<div >6. Cool gadgets and websites</div>
<div >7. Productivity (Too many technologies to explore, not much time available)</div>


<div style="color:#0000ff;">For example, the below command deletes the line which matches with “Sysadmin”.</div>
==== Deletes the line from which matches the given pattern and 2lines next to that. ====


<div style="color:#0000ff;">sed /Sysadmin/d thegeekstuff.txt</div>
<div >sed '/Storage/,+2d' thegeekstuff.txt</div>
<div style="color:#0000ff;">2. Databases - Oracle, mySQL etc.</div>
<div >1. Linux - Sysadmin, Scripting etc.</div>
<div style="color:#0000ff;">3. Hardware</div>
<div >2. Databases - Oracle, mySQL etc.</div>
<div style="color:#0000ff;">4. Security (Firewall, Network, Online Security etc)</div>
<div >3. Hardware</div>
<div style="color:#0000ff;">5. Storage</div>
<div >4. Security (Firewall, Network, Online Security etc)</div>
<div style="color:#0000ff;">6. Cool gadgets and websites</div>
<div >8. Website Design</div>
<div style="color:#0000ff;">7. Productivity (Too many technologies to explore, not much time available)</div>
<div >9. Software Development</div>
<div style="color:#0000ff;">8. Website Design</div>
<div >10.Windows- Sysadmin, reboot etc.</div>
<div style="color:#0000ff;">9. Software Development</div>


==== {{anchor|RefHeadingToc27541725578261}} Deletes the line from which matches the given pattern to end of the file. ====
==== Delete blank Line from a file using sed ====


<div style="color:#0000ff;">sed '/Website/,$d' thegeekstuff.txt</div>
<div >You can also remove blank lines with sed. The following sed example shows how to use sed and remove blank lines.</div>
<div style="color:#0000ff;">1. Linux - Sysadmin, Scripting etc.</div>
<div style="color:#0000ff;">2. Databases - Oracle, mySQL etc.</div>
<div style="color:#0000ff;">3. Hardware</div>
<div style="color:#0000ff;">4. Security (Firewall, Network, Online Security etc)</div>
<div style="color:#0000ff;">5. Storage</div>
<div style="color:#0000ff;">6. Cool gadgets and websites</div>
<div style="color:#0000ff;">7. Productivity (Too many technologies to explore, not much time available)</div>


==== {{anchor|RefHeadingToc27561725578261}} Deletes the line from which matches the given pattern and 2lines next to that. ====
<div >sed '/^$/d' thegeekstuff.txt</div>
<div >1. Linux - Sysadmin, Scripting etc.</div>
<div >2. Databases - Oracle, mySQL etc.</div>
<div >3. Hardware</div>
<div >4. Security (Firewall, Network, Online Security etc)</div>
<div >5. Storage</div>
<div >6. Cool gadgets and websites</div>
<div >7. Productivity (Too many technologies to explore, not much time available)</div>
<div >8. Website Design</div>
<div >9. Software Development</div>
<div >10.Windows- Sysadmin, reboot etc.</div>


<div style="color:#0000ff;">sed '/Storage/,+2d' thegeekstuff.txt</div>
== Suchen und Ersetzen ==
<div style="color:#0000ff;">1. Linux - Sysadmin, Scripting etc.</div>
<div style="color:#0000ff;">2. Databases - Oracle, mySQL etc.</div>
<div style="color:#0000ff;">3. Hardware</div>
<div style="color:#0000ff;">4. Security (Firewall, Network, Online Security etc)</div>
<div style="color:#0000ff;">8. Website Design</div>
<div style="color:#0000ff;">9. Software Development</div>
<div style="color:#0000ff;">10.Windows- Sysadmin, reboot etc.</div>
 
==== {{anchor|RefHeadingToc27581725578261}} Delete blank Line from a file using sed ====
 
<div style="color:#0000ff;">You can also remove blank lines with sed. The following sed example shows how to use sed and remove blank lines.</div>
 
<div style="color:#0000ff;">sed '/^$/d' thegeekstuff.txt</div>
<div style="color:#0000ff;">1. Linux - Sysadmin, Scripting etc.</div>
<div style="color:#0000ff;">2. Databases - Oracle, mySQL etc.</div>
<div style="color:#0000ff;">3. Hardware</div>
<div style="color:#0000ff;">4. Security (Firewall, Network, Online Security etc)</div>
<div style="color:#0000ff;">5. Storage</div>
<div style="color:#0000ff;">6. Cool gadgets and websites</div>
<div style="color:#0000ff;">7. Productivity (Too many technologies to explore, not much time available)</div>
<div style="color:#0000ff;">8. Website Design</div>
<div style="color:#0000ff;">9. Software Development</div>
<div style="color:#0000ff;">10.Windows- Sysadmin, reboot etc.</div>
 
== {{anchor|RefHeading25583109232536}} Suchen und Ersetzen ==


In diesem Falle steht das Trennzeichen "/" an drei Stellen: vor und hinter der RE, also dem Suchmuster und hinter dem Ersetzungsmuster.  
In diesem Falle steht das Trennzeichen "/" an drei Stellen: vor und hinter der RE, also dem Suchmuster und hinter dem Ersetzungsmuster.  
Zeile 877: Zeile 815:
Logischer Weise müsste der Schrägstrich viermal vorkommen, aber sed hat die beiden mittleren Schrägstriche zu einem verschmolzen.  
Logischer Weise müsste der Schrägstrich viermal vorkommen, aber sed hat die beiden mittleren Schrägstriche zu einem verschmolzen.  


=== {{anchor|RefHeading3008221082722535}} Zeichen ersetzen [s] ===
=== Zeichen ersetzen [s] ===


Das dem s-Kommando folgende Zeichen wird als Trennzeichen angesehen.  
Das dem s-Kommando folgende Zeichen wird als Trennzeichen angesehen.  
Zeile 893: Zeile 831:


sed 's#RegEx#Regulärer Ausdruck#' test.txt
sed 's#RegEx#Regulärer Ausdruck#' test.txt
  1       Der Aufruf des Stream Editors besitzt immer das Format:
  1 Der Aufruf des Stream Editors besitzt immer das Format:
  2      
  2  
  3             sed 'Kommando' Dateiname
  3 sed 'Kommando' Dateiname
  4      
  4  
  5       Dabei kann dem Kommando mitgeteilt werden, welche Zeilen der
  5 Dabei kann dem Kommando mitgeteilt werden, welche Zeilen der
  6       Eingabedatei es bearbeiten soll. Als Adressierung kommen folgende
  6 Eingabedatei es bearbeiten soll. Als Adressierung kommen folgende
  7       Mechanismen in Frage:
  7 Mechanismen in Frage:
  8      
  8  
  9       Keine Angabe   Alle Zeilen    
  9 Keine Angabe Alle Zeilen  
  10             Nummer Genau diese Zeile      
  10 Nummer Genau diese Zeile  
  11             Start, Ende     Alle Zeilen von "Start" bis "Ende"                             12             $       Symbolisiert die letzte 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
  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
  14 1, Regulärer Ausdruck Von Zeile 1 bis zur ersten Zeile, die RegEx enthält


=== {{anchor|RefHeadingToc48311725578261}} Globale Substitution ===
=== 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:  
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'''
'''sed -n 's#RegEx#Regulärer Ausdruck#gp' test.txt'''
  13     Regulärer Ausdruck     Zeilen, die den Regulären Ausdruck enthalten
  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
  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).  
Da wir nur an den modifizierten Zeilen interessiert sind, haben wir das Sed mitgeteilt (Option -n).  
Zeile 924: Zeile 862:


'''<nowiki>sed 's/^\([[:space:]]*[1-9]\{1,\}\)/\10/' test.txt</nowiki>'''
'''<nowiki>sed 's/^\([[:space:]]*[1-9]\{1,\}\)/\10/' test.txt</nowiki>'''
  10             Der Aufruf des Stream Editors besitzt immer das Format:
  10 Der Aufruf des Stream Editors besitzt immer das Format:
  20            
  20  
  30                   sed 'Kommando' Dateiname
  30 sed 'Kommando' Dateiname
  40            
  40  
  50             Dabei kann dem Kommando mitgeteilt werden, welche Zeilen der
  50 Dabei kann dem Kommando mitgeteilt werden, welche Zeilen der
  60             Eingabedatei es bearbeiten soll. Als Adressierung kommen folgende
  60 Eingabedatei es bearbeiten soll. Als Adressierung kommen folgende
  70             Mechanismen in Frage:
  70 Mechanismen in Frage:
  80            
  80  
  90             Keine Angabe   Alle Zeilen
  90 Keine Angabe Alle Zeilen
  100             Nummer Genau diese Zeile
  100 Nummer Genau diese Zeile
  110             Start, Ende     Alle Zeilen von "Start" bis "Ende"
  110 Start, Ende Alle Zeilen von "Start" bis "Ende"
  120             $       Symbolisiert die letzte Zeile
  120 $ Symbolisiert die letzte Zeile
  130             RegEx   Zeilen, die den Regulären Ausdruck enthalten
  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.  
  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.  
* 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.  
* 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.  
* 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 ====
==== Beispiel ====
Zeile 951: Zeile 887:
* beide Strings müssten durch "/" begrenzt werden
* beide Strings müssten durch "/" begrenzt werden
* sed verschmilzt die mittleren Schrägstriche zu einem!
* sed verschmilzt die mittleren Schrägstriche zu einem!


/isst/ist/
/isst/ist/
* <nowiki># dies erscheint zunächst unlogisch.</nowiki>
* <nowiki># dies erscheint zunächst unlogisch.</nowiki>


Der Befehl "s" für "suchen & ersetzen" steht vor(!) der RE.  
Der Befehl "s" für "suchen & ersetzen" steht vor(!) der RE.  


sed 's/isst/ist/' < sed-test.txt
sed 's/isst/ist/' < sed-test.txt  
* Befehl "s" steht am Anfang!
* Befehl "s" steht am Anfang!
* sed selektiert alle Zeilen, in denen "isst" vorkommt, ersetzt "isst" durch "ist"
* sed selektiert alle Zeilen, in denen "isst" vorkommt, ersetzt "isst" durch "ist"
* und gibt das Ergebnis am Bildschirm aus
* und gibt das Ergebnis am Bildschirm aus


Um die Änderungen in die Datei zu schreiben, gibt es zwei Möglichkeiten:
Um die Änderungen in die Datei zu schreiben, gibt es zwei Möglichkeiten:
Zeile 978: Zeile 902:
===== mit Hilfe einer temporären Datei =====
===== mit Hilfe einer temporären Datei =====


sed 's/isst/ist/' < sed-test.txt > sed-test2.txt * Ausgabe in temporäre Datei umleiten
sed 's/isst/ist/' < sed-test.txt > sed-test2.txt * Ausgabe in temporäre Datei umleiten
 
 


vim sed-test2.txt* Ergebnis kontrollieren!
vim sed-test2.txt* Ergebnis kontrollieren!


mv sed-test2.txt sed-test.txt* Originaldatei ersetzen durch temporäre Datei
mv sed-test2.txt sed-test.txt* Originaldatei ersetzen durch temporäre Datei


===== direkt =====
===== direkt =====


sed -i 's/isst/ist/' sed-test.txt* Vorsicht, Änderungen werden direkt in Datei geschrieben!
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:  
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
sed 's/isst/ist/g' < sed-test.txt


=== {{anchor|RefHeading25585109232536}} Selektives Suchen und Ersetzen ===
=== 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.  
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.  
Zeile 1.010: Zeile 926:
Es sind also zwei Vorgänge erforderlich:* Bereichsauswahl über die RE "/isst/"
Es sind also zwei Vorgänge erforderlich:* Bereichsauswahl über die RE "/isst/"
* Suchen des Zeilenendes und ersetzen durch " --Fehler!".
* Suchen des Zeilenendes und ersetzen durch " --Fehler!".


Genau genommen wird nicht das Zeilenende ersetzt, sondern ein gedachte fiktives "leer-Zeichen" (sozusagen "") vor dem Zeilenende.  
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.  
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
sed '/isst/{s/$/ --Fehler!/}' < sed-test.txt
Zeile 1.023: Zeile 936:
* $ -> Platzhalterzeichen für "Zeilenende" (in Suchen & Ersetzen Anweisungen)
* $ -> Platzhalterzeichen für "Zeilenende" (in Suchen & Ersetzen Anweisungen)
* s/$/ --Fehler!/ -> fiktives "leer-Zeichen" vor dem Zeilenende wird ersetzt durch " --Fehler!"
* s/$/ --Fehler!/ -> fiktives "leer-Zeichen" vor dem Zeilenende wird ersetzt durch " --Fehler!"


Bei expliziter Bereichsauswahl funktioniert dies analog.  
Bei expliziter Bereichsauswahl funktioniert dies analog.  
Zeile 1.034: Zeile 945:
sed '2,3{s/$/ --Fehler!/}' < sed-test.txt
sed '2,3{s/$/ --Fehler!/}' < sed-test.txt
* 2,3 -> explizite Bereichsauswahl: Zeile 2-3
* 2,3 -> explizite Bereichsauswahl: Zeile 2-3


Beachten Sie, dass die explizite Bereichsauswahl durch keine Delimiterzeichen "/" eingegrenzt ist.  
Beachten Sie, dass die explizite Bereichsauswahl durch keine Delimiterzeichen "/" eingegrenzt ist.  
Zeile 1.045: Zeile 954:
sed '${s/$/ --Fehler!/}' < sed-test.txt
sed '${s/$/ --Fehler!/}' < sed-test.txt
* <nowiki># $ </nowiki>-> explizite Bereichsauswahl; "$" steht hier für "letzte Zeile"
* <nowiki># $ </nowiki>-> explizite Bereichsauswahl; "$" steht hier für "letzte Zeile"


==== Beispiel ====
==== Beispiel ====
Zeile 1.056: Zeile 963:
* ^ -> Platzhalterzeichen für "Zeilenanfang"
* ^ -> Platzhalterzeichen für "Zeilenanfang"
* ein fiktives "leer-Zeichen" ("") am Zeilenanfang wird ersetzt durch "Anfang--"
* ein fiktives "leer-Zeichen" ("") am Zeilenanfang wird ersetzt durch "Anfang--"


Der vorige Befehl funktioniert auch ohne {}, ist aber schwerer zu lesen:  
Der vorige Befehl funktioniert auch ohne {}, ist aber schwerer zu lesen:  
Zeile 1.065: Zeile 968:
sed '1s/^/Anfang--/' < sed-test.txt
sed '1s/^/Anfang--/' < sed-test.txt


=== {{anchor|RefHeading39741624094027}} Control-Character ===
=== Control-Character ===


Mit Hilfe von sed können verschiedenste Konvertierungen durchgeführt werden, z.B. von DOS- (CR-LF) zu Unix Dateiendezeichen (LF). Control-Character können entweder als escape-character oder als hexadezimal-character dargestellt werden.  
Mit Hilfe von sed können verschiedenste Konvertierungen durchgeführt werden, z.B. von DOS- (CR-LF) zu Unix Dateiendezeichen (LF). Control-Character können entweder als escape-character oder als hexadezimal-character dargestellt werden.  


==== {{anchor|RefHeadingToc27361725578261}} Wichtige control-character ====
==== Wichtige control-character ====
 
Bezeichnung      escape  hex    "cat -A"
linefeed        \n      \x0a  $
carriage-return  \r      \x0d  ^M
tab              \t      \x09  ^I


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"  
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'
a=$'Tabulator: \x09 CR: \x0d LF: \x0a'
echo -e "$a" | sed -n 'l'
echo -e "$a" | sed -n 'l'


==== {{anchor|RefHeadingToc27381725578261}} Escape-character ====
==== Escape-character ====


a="Zeile1\r\nZeile2"  
a="Zeile1\r\nZeile2"  


am Ende von Zeile1 steht CR-LF (=DOS-Zeilenende)
am Ende von Zeile1 steht CR-LF (=DOS-Zeilenende)
Zeile 1.093: Zeile 994:
Inhalt wird inkl. Kontrollzeichen ausgegeben und darstellbar gemacht (cat -A), der carriage-return wird als ^M dargestellt (0x0D)
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
echo -e "$a" | sed 's/\r//' | cat -A


der carriage-return wird durch "leer" ersetzt, ^M wird nicht mehr angezeigt
der carriage-return wird durch "leer" ersetzt, ^M wird nicht mehr angezeigt
Zeile 1.099: Zeile 1.000:
unset a
unset a


==== {{anchor|RefHeadingToc27401725578261}} Hexadezimal-character ====
==== Hexadezimal-character ====


a=$'Zeile1\x0d\x0aZeile2'
a=$'Zeile1\x0d\x0aZeile2'  


am Ende von Zeile1 steht CR-LF (0x0d+0x0a)
am Ende von Zeile1 steht CR-LF (0x0d+0x0a)


echo -e "$a" | cat -A
echo -e "$a" | cat -A
  echo -e "$a" | sed 's/\x0d//' | cat -A  
  echo -e "$a" | sed 's/\x0d//' | cat -A  
  unset a
  unset a


=== {{anchor|RefHeading14701762120244}} Beispiele ===
=== Beispiele ===
 
==== {{anchor|RefHeadingToc27601725578261}} Text in Dateien mit RegEx ====
 
<div style="color:#0000ff;">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.</div>
 
<div style="color:#0000ff;">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.</div>
 
<div style="color:#0000ff;">Syntax:</div>
<div style="color:#0000ff;"><nowiki>#sed 'ADDRESSs/REGEXP/REPLACEMENT/FLAGS' filename</nowiki></div>
<div style="color:#0000ff;"><nowiki>#sed 'PATTERNs/REGEXP/REPLACEMENT/FLAGS' filename</nowiki></div><div style="color:#0000ff;"></div>
* <div style="color:#0000ff;">s is substitute command</div>
* <div style="color:#0000ff;">/ is a delimiter</div>
* <div style="color:#0000ff;">REGEXP is regular expression to match</div>
* <div style="color:#0000ff;">REPLACEMENT is a value to replace</div>


==== Text in Dateien mit RegEx ====


<div >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.</div>


<div style="color:#0000ff;"></div>
<div >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.</div>


<div style="color:#0000ff;">FLAGS can be any of the following</div>* <div style="color:#0000ff;">g Replace all the instance of REGEXP with REPLACEMENT</div>
<div >Syntax:</div>
* <div style="color:#0000ff;">n Could be any number,replace nth instance of the REGEXP with REPLACEMENT.</div>
<div ><nowiki>#sed 'ADDRESSs/REGEXP/REPLACEMENT/FLAGS' filename</nowiki></div>
* <div style="color:#0000ff;">p If substitution was made, then prints the new pattern space.</div>
<div ></div>
* <div style="color:#0000ff;">i match REGEXP in a case-insensitive manner.</div>
* <div >s is substitute command</div>
* <div style="color:#0000ff;">w file If substitution was made, write out the result to the given file.</div>
* <div >/ is a delimiter</div>
* <div style="color:#0000ff;">We can use different delimiters ( one of @ % ; : ) instead of /</div>
* <div >REGEXP is regular expression to match</div>
* <div >REPLACEMENT is a value to replace</div>


<div ></div>


<div >g Replace all the instance of REGEXP with REPLACEMENT</div>
* <div >n Could be any number,replace nth instance of the REGEXP with REPLACEMENT.</div>
* <div >p If substitution was made, then prints the new pattern space.</div>
* <div >i match REGEXP in a case-insensitive manner.</div>
* <div >w file If substitution was made, write out the result to the given file.</div>
* <div >We can use different delimiters ( one of @ % ; : ) instead of /</div>


<div style="color:#0000ff;"></div>
<div ></div>


<div style="color:#0000ff;">Let us first create thegeekstuff.txt file that will be used in all the examples mentioned below.</div>
<div >Let us first create thegeekstuff.txt file that will be used in all the examples mentioned below.</div>


<div style="color:#0000ff;">cat thegeekstuff.txt</div>
<div >cat thegeekstuff.txt</div>
<div style="color:#0000ff;"><nowiki># Instruction Guides</nowiki></div>
<div ><nowiki># Instruction Guides</nowiki></div>
<div style="color:#0000ff;">1. Linux Sysadmin, Linux Scripting etc.</div>
<div >1. Linux Sysadmin, Linux Scripting etc.</div>
<div style="color:#0000ff;">2. Databases - Oracle, mySQL etc.</div>
<div >2. Databases - Oracle, mySQL etc.</div>
<div style="color:#0000ff;">3. Security (Firewall, Network, Online Security etc)</div>
<div >3. Security (Firewall, Network, Online Security etc)</div>
<div style="color:#0000ff;">4. Storage in Linux</div>
<div >4. Storage in Linux</div>
<div style="color:#0000ff;">5. Productivity (Too many technologies to explore, not much time available)</div>
<div >5. Productivity (Too many technologies to explore, not much time available)</div>
<div style="color:#0000ff;"><nowiki># Additional FAQS</nowiki></div>
<div ><nowiki># Additional FAQS</nowiki></div>
<div style="color:#0000ff;">6. Windows- Sysadmin, reboot etc.</div>
<div >6. Windows- Sysadmin, reboot etc.</div>


<div style="color:#0000ff;">Let us review some interesting examples for substitution now.</div>
<div >Let us review some interesting examples for substitution now.</div>


==== {{anchor|RefHeadingToc27621725578261}} Ersetzen von “Linux” durch “Unix” (s) ====
==== Ersetzen von “Linux” durch “Unix” (s) ====


<div style="color:#0000ff;">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.</div>
<div >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.</div>


<div style="color:#0000ff;">sed 's/Linux/Unix/' thegeekstuff.txt</div>
<div >sed 's/Linux/Unix/' thegeekstuff.txt</div>
<div style="color:#0000ff;"><nowiki># Instruction Guides</nowiki></div>
<div ><nowiki># Instruction Guides</nowiki></div>
<div style="color:#0000ff;">1. Unix Sysadmin, Linux Scripting etc.</div>
<div >1. Unix Sysadmin, Linux Scripting etc.</div>
<div style="color:#0000ff;">2. Databases - Oracle, mySQL etc.</div>
<div >2. Databases - Oracle, mySQL etc.</div>
<div style="color:#0000ff;">3. Security (Firewall, Network, Online Security etc)</div>
<div >3. Security (Firewall, Network, Online Security etc)</div>
<div style="color:#0000ff;">4. Storage in Unix</div>
<div >4. Storage in Unix</div>
<div style="color:#0000ff;">5. Productivity (Too many technologies to explore, not much time available)</div>
<div >5. Productivity (Too many technologies to explore, not much time available)</div>
<div style="color:#0000ff;"><nowiki># Additional FAQS</nowiki></div>
<div ><nowiki># Additional FAQS</nowiki></div>
<div style="color:#0000ff;">6. Windows- Sysadmin, reboot etc.</div>
<div >6. Windows- Sysadmin, reboot etc.</div>


==== {{anchor|RefHeadingToc27641725578261}} Alle Treffer ersetzen (s//g) ====
==== Alle Treffer ersetzen (s//g) ====


<div style="color:#0000ff;">The below sed command replaces all occurrences of Linux to Linux-Unix using global substitution flag “g”.</div>
<div >The below sed command replaces all occurrences of Linux to Linux-Unix using global substitution flag “g”.</div>


<div style="color:#0000ff;">sed 's/Linux/Linux-Unix/g' thegeekstuff.txt</div>
<div >sed 's/Linux/Linux-Unix/g' thegeekstuff.txt</div>
<div style="color:#0000ff;"><nowiki># Instruction Guides</nowiki></div>
<div ><nowiki># Instruction Guides</nowiki></div>
<div style="color:#0000ff;">1. Linux-Unix Sysadmin, Linux-Unix Scripting etc.</div>
<div >1. Linux-Unix Sysadmin, Linux-Unix Scripting etc.</div>
<div style="color:#0000ff;">2. Databases - Oracle, mySQL etc.</div>
<div >2. Databases - Oracle, mySQL etc.</div>
<div style="color:#0000ff;">3. Security (Firewall, Network, Online Security etc)</div>
<div >3. Security (Firewall, Network, Online Security etc)</div>
<div style="color:#0000ff;">4. Storage in Linux-Unix</div>
<div >4. Storage in Linux-Unix</div>
<div style="color:#0000ff;">5. Productivity (Too many technologies to explore, not much time available)</div>
<div >5. Productivity (Too many technologies to explore, not much time available)</div>
<div style="color:#0000ff;"><nowiki># Additional FAQS</nowiki></div>
<div ><nowiki># Additional FAQS</nowiki></div>
<div style="color:#0000ff;">6. Windows- Sysadmin, reboot etc.</div>
<div >6. Windows- Sysadmin, reboot etc.</div>


==== {{anchor|RefHeadingToc27661725578261}} Jeden zweiten Treffer ersetzen (s//2) ====
==== Jeden zweiten Treffer ersetzen (s//2) ====


<div style="color:#0000ff;">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.</div>
<div >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.</div>


<div style="color:#0000ff;">sed 's/Linux/Linux-Unix/2' thegeekstuff.txt</div>
<div >sed 's/Linux/Linux-Unix/2' thegeekstuff.txt</div>
<div style="color:#0000ff;"><nowiki># Instruction Guides</nowiki></div>
<div ><nowiki># Instruction Guides</nowiki></div>
<div style="color:#0000ff;">1. Linux Sysadmin, Linux-Unix Scripting etc.</div>
<div >1. Linux Sysadmin, Linux-Unix Scripting etc.</div>
<div style="color:#0000ff;">2. Databases - Oracle, mySQL etc.</div>
<div >2. Databases - Oracle, mySQL etc.</div>
<div style="color:#0000ff;">3. Security (Firewall, Network, Online Security etc)</div>
<div >3. Security (Firewall, Network, Online Security etc)</div>
<div style="color:#0000ff;">4. Storage in Linux</div>
<div >4. Storage in Linux</div>
<div style="color:#0000ff;">5. Productivity (Too many technologies to explore, not much time available)</div>
<div >5. Productivity (Too many technologies to explore, not much time available)</div>
<div style="color:#0000ff;"><nowiki># Additional FAQS</nowiki></div>
<div ><nowiki># Additional FAQS</nowiki></div>
<div style="color:#0000ff;">6. Windows- Sysadmin, reboot etc.</div>
<div >6. Windows- Sysadmin, reboot etc.</div>


==== {{anchor|RefHeadingToc27701725578261}} Nur ersetzen, wenn eine Zeile einen Treffer ergibt ====
==== Nur ersetzen, wenn eine Zeile einen Treffer ergibt ====


<div style="color:#0000ff;">In this example, if the line matches with the pattern “-”, then it replaces all the characters from “-” with the empty.</div>
<div >In this example, if the line matches with the pattern “-”, then it replaces all the characters from “-” with the empty.</div>


<div style="color:#0000ff;">sed '/\-/s/\-.*//g' thegeekstuff.txt</div>
<div >sed '/\-/s/\-.*//g' thegeekstuff.txt</div>
<div style="color:#0000ff;"><nowiki># Instruction Guides</nowiki></div>
<div ><nowiki># Instruction Guides</nowiki></div>
<div style="color:#0000ff;">1. Linux Sysadmin, Linux Scripting etc.</div>
<div >1. Linux Sysadmin, Linux Scripting etc.</div>
<div style="color:#0000ff;">2. Databases</div>
<div >2. Databases</div>


<div style="color:#0000ff;">3.</div>
<div >3.</div>
<div style="color:#0000ff;">4.</div>
<div >4.</div>
<div style="color:#0000ff;">5.</div>
<div >5.</div>
<div style="color:#0000ff;"><nowiki>#</nowiki></div>
<div ><nowiki>#</nowiki></div>
<div style="color:#0000ff;">6.</div>
<div >6.</div>


<div style="color:#0000ff;">Security (Firewall, Network, Online Security etc)</div>
<div >Security (Firewall, Network, Online Security etc)</div>
<div style="color:#0000ff;">Storage in Linux</div>
<div >Storage in Linux</div>
<div style="color:#0000ff;">Productivity (Too many technologies to explore, not much time available)</div>
<div >Productivity (Too many technologies to explore, not much time available)</div>
<div style="color:#0000ff;">Additional FAQS</div>
<div >Additional FAQS</div>
<div style="color:#0000ff;">Windows</div>
<div >Windows</div>


==== {{anchor|RefHeadingToc27721725578261}} Letzten X Zeichen jeder Zeile löschen ====
==== Letzten X Zeichen jeder Zeile löschen ====


<div style="color:#0000ff;">This sed example deletes last 3 characters from each line.</div>
<div >This sed example deletes last 3 characters from each line.</div>


<div style="color:#0000ff;">sed 's/...$//' thegeekstuff.txt</div>
<div >sed 's/...$//' thegeekstuff.txt</div>
<div style="color:#0000ff;"><nowiki># Instruction Gui</nowiki></div>
<div ><nowiki># Instruction Gui</nowiki></div>
<div style="color:#0000ff;">1. Linux Sysadmin, Linux Scripting e</div>
<div >1. Linux Sysadmin, Linux Scripting e</div>
<div style="color:#0000ff;">2. Databases - Oracle, mySQL e</div>
<div >2. Databases - Oracle, mySQL e</div>
<div style="color:#0000ff;">3. Security (Firewall, Network, Online Security e</div>
<div >3. Security (Firewall, Network, Online Security e</div>
<div style="color:#0000ff;">4. Storage in Li</div>
<div >4. Storage in Li</div>
<div style="color:#0000ff;">5. Productivity (Too many technologies to explore, not much time availab</div>
<div >5. Productivity (Too many technologies to explore, not much time availab</div>
<div style="color:#0000ff;"><nowiki># Additional F</nowiki></div>
<div ><nowiki># Additional F</nowiki></div>
<div style="color:#0000ff;">6. Windows- Sysadmin, reboot e</div>
<div >6. Windows- Sysadmin, reboot e</div>


==== {{anchor|RefHeadingToc27741725578261}} Kommentare löschen ====
==== Kommentare löschen ====


<div style="color:#0000ff;">Delete all the comment lines from a file as shown below using sed command.</div>
<div >Delete all the comment lines from a file as shown below using sed command.</div>


<span style="color:#0000ff;">'''sed -e 's/#.*//' thegeekstuff.txt'''</span>
<span >'''sed -e 's/#.*//' thegeekstuff.txt'''</span>
<div style="color:#0000ff;">1. Linux Sysadmin, Linux Scripting etc.</div>
<div >1. Linux Sysadmin, Linux Scripting etc.</div>
<div style="color:#0000ff;">2. Databases - Oracle, mySQL etc.</div>
<div >2. Databases - Oracle, mySQL etc.</div>
<div style="color:#0000ff;">3. Security (Firewall, Network, Online Security etc)</div>
<div >3. Security (Firewall, Network, Online Security etc)</div>
<div style="color:#0000ff;">4. Storage in Linux</div>
<div >4. Storage in Linux</div>
<div style="color:#0000ff;">5. Productivity (Too many technologies to explore, not much time available)</div>
<div >5. Productivity (Too many technologies to explore, not much time available)</div>
<div style="color:#0000ff;">6. Windows- Sysadmin, reboot etc.</div>
<div >6. Windows- Sysadmin, reboot etc.</div>


==== {{anchor|RefHeadingToc27761725578261}} Kommentare und leere Zeilen löschen ====
==== Kommentare und leere Zeilen löschen ====


<div style="color:#0000ff;">In this example, there are two commands seperated by ‘;’</div>
<div >In this example, there are two commands seperated by ‘;’</div>


<div style="color:#0000ff;">First command replaces the lines starting with the # to the blank lines</div>
<div >First command replaces the lines starting with the # to the blank lines</div>


<div style="color:#0000ff;">Second command deletes the empty lines.</div>
<div >Second command deletes the empty lines.</div>


<span style="color:#0000ff;">'''sed -e 's/#.*//;/^$/d' thegeekstuff.txt'''</span>
<span >'''sed -e 's/#.*//;/^$/d' thegeekstuff.txt'''</span>
<div style="color:#0000ff;">1. Linux Sysadmin, Linux Scripting etc.</div>
<div >1. Linux Sysadmin, Linux Scripting etc.</div>
<div style="color:#0000ff;">2. Databases - Oracle, mySQL etc.</div>
<div >2. Databases - Oracle, mySQL etc.</div>
<div style="color:#0000ff;">3. Security (Firewall, Network, Online Security etc)</div>
<div >3. Security (Firewall, Network, Online Security etc)</div>
<div style="color:#0000ff;">4. Storage in Linux</div>
<div >4. Storage in Linux</div>
<div style="color:#0000ff;">5. Productivity (Too many technologies to explore, not much time available)</div>
<div >5. Productivity (Too many technologies to explore, not much time available)</div>
<div style="color:#0000ff;">6. Windows- Sysadmin, reboot etc.</div>
<div >6. Windows- Sysadmin, reboot etc.</div>


==== {{anchor|RefHeadingToc27781725578261}} Zeilenwechsel konvertieren ====
==== Zeilenwechsel konvertieren ====


===== DOS newlines (CR/LF) ins Unix-Format ändern =====
===== DOS newlines (CR/LF) ins Unix-Format ändern =====


<div style="color:#0000ff;">Copy the DOS file to Unix, you could find \r\n in the end of each line.</div>
<div >Copy the DOS file to Unix, you could find \r\n in the end of each line.</div>


<div style="color:#0000ff;">This example converts the DOS file format to Unix file format using sed command.</div>
<div >This example converts the DOS file format to Unix file format using sed command.</div>


<span style="color:#0000ff;">'''$sed 's/.$//' filename'''</span>
<span >'''$sed 's/.$//' filename'''</span>


==== {{anchor|RefHeading2661739995267}} Rekursives Suchen und Ersetzen ====
==== Rekursives Suchen und Ersetzen ====


Ersetzen einer Zeichenkette in allen Daten einer Verzeichnisstruktur.
Ersetzen einer Zeichenkette in allen Daten einer Verzeichnisstruktur.
Zeile 1.276: Zeile 1.172:
'''find . -type f -print0 | xargs -0 -n 1 sed -i -e "s/suche/ersetze/g"'''
'''find . -type f -print0 | xargs -0 -n 1 sed -i -e "s/suche/ersetze/g"'''


===== Beispiel mit escape Zeichen \ =====
===== Beispiel mit escape Zeichen \ =====


''‘typo3temp/pics''' ersetzen mit ''‘../../typo3temp/pics'''
''‘typo3temp/pics''' ersetzen mit ''‘../../typo3temp/pics'''
Zeile 1.282: Zeile 1.178:
'''find . -name *.html -type f -print0 | xargs -0 -n 1 sed -i -e \ "s/’temp\/pics/’..\/..\/temp\/pics/g"'''
'''find . -name *.html -type f -print0 | xargs -0 -n 1 sed -i -e \ "s/’temp\/pics/’..\/..\/temp\/pics/g"'''


==== {{anchor|RefHeadingToc27801725578261}} HTML Tags aus Datei entfernen ====
==== 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.
In this example, the regular expression given in the sed command matches the html tags and replaces with the empty.
Zeile 1.290: Zeile 1.186:
This is an example.
This is an example.


== {{anchor|RefHeading3008241082722535}} 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.  
Zeile 1.299: Zeile 1.195:


'''sed -e '3,$d' -e 's# #.#g' test.txt'''
'''sed -e '3,$d' -e 's# #.#g' test.txt'''
  .1             Der.Aufruf.des.Stream.Editors.besitzt.immer.das.Format:
  .1 Der.Aufruf.des.Stream.Editors.besitzt.immer.das.Format:
  .2             * Zuerst werden alle Zeilen ab der 3. Zeile entfernt  
  .2 * Zuerst werden alle Zeilen ab der 3. Zeile entfernt  
* anschließend die Leerzeichen durch Punkte ersetzt<br/>
* anschließend die Leerzeichen durch Punkte ersetzt<br/>


'''Die Reihenfolge der Kommandos kann das Ergebnis beeinflussen'''
'''Die Reihenfolge der Kommandos kann das Ergebnis beeinflussen'''
Zeile 1.311: Zeile 1.206:


'''sed '{s/ /./g;3,$d}' test.txt'''
'''sed '{s/ /./g;3,$d}' test.txt'''
  .1             Der.Aufruf.des.Stream.Editors.besitzt.immer.das.Format:
  .1 Der.Aufruf.des.Stream.Editors.besitzt.immer.das.Format:
  .2            
  .2  


==== {{anchor|RefHeading25593109232536}} Verkettung von sed-Anweisungen ====
==== Verkettung von sed-Anweisungen ====


sed-Anweisungen lassen sich entweder mit Hilfe der Option "-e" aneinanderreihen oder mittels Pipe.  
sed-Anweisungen lassen sich entweder mit Hilfe der Option "-e" aneinanderreihen oder mittels Pipe.  
Zeile 1.327: Zeile 1.222:
# Reduktion der Auswahlmenge
# Reduktion der Auswahlmenge
# Ersetzung
# Ersetzung


Eine andere Möglichkeit besteht darin, mehrere Anweisungen an sed zu übergeben, die sukzessive abgearbeitet werden. Dies kann z.B. dann verwendet werden, wenn innerhalb einer Datei mehrere "Suchen & Ersetzen"-Befehle nacheinander durchgeführt werden sollen.  
Eine andere Möglichkeit besteht darin, mehrere Anweisungen an sed zu übergeben, die sukzessive abgearbeitet werden. Dies kann z.B. dann verwendet werden, wenn innerhalb einer Datei mehrere "Suchen & Ersetzen"-Befehle nacheinander durchgeführt werden sollen.  
Zeile 1.341: Zeile 1.234:
# Ersetzung1
# Ersetzung1
# Ersetzung2
# 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.  
Statt mehrere Anweisung mittels "-e" aneinanderzureihen, kann man diese auch durch ";" verketten, wobei das einfache Hochkomma nur am Anfang und am Ende stehen darf.  
Zeile 1.351: Zeile 1.242:
* analog zur vorigen Anweisung
* analog zur vorigen Anweisung


 
== Einfügen [i|a] ==
 
== {{anchor|RefHeading3008261082722535}} 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  
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.  
* »a« (append) schreibt den neuen Text '''nach '''der Zeile.  


 
==== Beispiel ====
 
==== Beispiel ====


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


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


== {{anchor|RefHeading3008301082722535}} Schreiben in eine Datei [w] ==
== Schreiben in eine Datei [w] ==


Das Ergebnis des Stream Editors lässt sich in einer Datei speichern:  
Das Ergebnis des Stream Editors lässt sich in einer Datei speichern:  
Zeile 1.420: Zeile 1.307:
'''sed -n '/^1/w out.txt' test.txt'''
'''sed -n '/^1/w out.txt' test.txt'''
'''cat out.txt'''
'''cat out.txt'''
  10             Nummer Genau diese Zeile
  10 Nummer Genau diese Zeile
  11             Start, Ende             Alle Zeilen von "Start" bis "Ende"
  11 Start, Ende Alle Zeilen von "Start" bis "Ende"
  12             $       Symbolisiert die letzte Zeile
  12 $ Symbolisiert die letzte Zeile
  13             RegEx   Zeilen, die den Regulären Ausdruck enthalten
  13 RegEx Zeilen, die den Regulären Ausdruck enthalten
  14             1, RegEx       Von Zeile 1 bis zur ersten Zeile, die RegEx enthält
  14 1, RegEx Von Zeile 1 bis zur ersten Zeile, die RegEx enthält


==== Änderungen in Datei schreiben und auf Konsole (s//gpw) ====
==== Änderungen in Datei schreiben und auf Konsole (s//gpw) ====
Zeile 1.433: Zeile 1.320:
1. Linux-Unix Sysadmin, Linux-Unix Scripting etc.
1. Linux-Unix Sysadmin, Linux-Unix Scripting etc.
4. Storage in Linux-Unix
4. Storage in Linux-Unix


cat output
cat output
Zeile 1.439: Zeile 1.325:
4. Storage in Linux-Unix
4. Storage in Linux-Unix


== {{anchor|RefHeading3008421082722535}} Dateien direkt bearbeiten ==
== Dateien direkt bearbeiten ==


Häufig ist es sinnvoll Dateien direkt zu bearbeiten, anstatt sie auf die Standardausgabe zu schreiben.  
Häufig ist es sinnvoll Dateien direkt zu bearbeiten, anstatt sie auf die Standardausgabe zu schreiben.  
Zeile 1.457: Zeile 1.343:
'''sed -i"" 's|Hallo|Hey|g' *.txt'''
'''sed -i"" 's|Hallo|Hey|g' *.txt'''


== {{anchor|RefHeading31741781900648}} Dateien ergänzen ==
== Dateien ergänzen ==


=== {{anchor|RefHeading2660539995267}} Zeile am Dateianfang einfügen ===
=== Zeile am Dateianfang einfügen ===


Dies ist auch ohne sed möglich, z.B. mit Hilfe von echo und cat  
Dies ist auch ohne sed möglich, z.B. mit Hilfe von echo und cat  
Zeile 1.466: Zeile 1.352:
echo "Anfang" | cat - 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
echo "Anfang" > sed-test2.txt; cat sed-test.txt >> sed-test2.txt


Mit Hilfe von sed geht dies eleganter.  
Mit Hilfe von sed geht dies eleganter.  
Zeile 1.474: Zeile 1.359:
* i=insert-Befehl
* i=insert-Befehl


 
=== Zeile innerhalb des Textes einfügen ===
 
=== {{anchor|RefHeading2660739995267}} Zeile innerhalb des Textes einfügen ===


Die folgende Anweisung fügt eine neue Zeile vor der vorletzten Zeile ein.  
Die folgende Anweisung fügt eine neue Zeile vor der vorletzten Zeile ein.  
Zeile 1.484: Zeile 1.367:
* i=insert-Befehl
* i=insert-Befehl


 
=== Zeile ans Dateiende anhängen ===
 
=== {{anchor|RefHeading2660939995267}} Zeile ans Dateiende anhängen ===


sed '$aEnde' < sed-test.txt > sed-test2.txt
sed '$aEnde' < sed-test.txt > sed-test2.txt
Zeile 1.492: Zeile 1.373:
* a=append-Befehl
* a=append-Befehl


 
=== Zeichen am Zeilenanfang einfügen ===
 
=== {{anchor|RefHeading2661139995267}} Zeichen am Zeilenanfang einfügen ===


Das Zeichen "#" soll in allen Zeilen an den Zeilenanfang gesetzt werden.  
Das Zeichen "#" soll in allen Zeilen an den Zeilenanfang gesetzt werden.  
Zeile 1.502: Zeile 1.381:
* /^/ <nowiki>="Zeilenanfangszeichen"</nowiki>
* /^/ <nowiki>="Zeilenanfangszeichen"</nowiki>
* /#/ <nowiki>= Replace-String</nowiki>
* /#/ <nowiki>= Replace-String</nowiki>


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.  
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.  
Zeile 1.511: Zeile 1.388:
sed 's/^Hier/Dort/' < sed-test.txt  
sed 's/^Hier/Dort/' < sed-test.txt  
* Hier" am Zeilenanfang wird ersetzt durch "Dort"
* Hier" am Zeilenanfang wird ersetzt durch "Dort"


===== Beispiel =====
===== Beispiel =====
Zeile 1.528: Zeile 1.403:
* {s...} <nowiki>= "suchen & ersetzen" wird nur in den selektierten Zeilen ausgeführt</nowiki>
* {s...} <nowiki>= "suchen & ersetzen" wird nur in den selektierten Zeilen ausgeführt</nowiki>


 
== Nächste Zeile beabeiten[n] ==
 
== {{anchor|RefHeading3008321082722535}} Nächste Zeile beabeiten[n] ==


Soll erst die dem Suchmuster folgende Zeile manipuliert werden, ist das n-Kommando der beste Kandidat:
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'''
'''sed -n '8,${n;s/\(.\{1,\}\)/*\1/p;}' test.txt'''
  <nowiki>* 9 </nowiki>           Keine Angabe   Alle Zeilen
  <nowiki>* 9 </nowiki> Keine Angabe Alle Zeilen
  <nowiki>*11 </nowiki>           $       Symbolisiert die letzte Zeile
  <nowiki>*11 </nowiki> $ Symbolisiert die letzte Zeile
  <nowiki>*13 </nowiki>           RegEx   Zeilen, die den Regulären Ausdruck enthalten
  <nowiki>*13 </nowiki> RegEx Zeilen, die den Regulären Ausdruck enthalten


Die Kommandozeile ist schwer verdaulich... aber der Reihe nach:  
Die Kommandozeile ist schwer verdaulich... aber der Reihe nach:  


 
{|class="wikitable"  
{| style="border-spacing:0;width:17.507cm;"
|-
|-
! style="border-top:0.05pt solid #000000;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding:0.097cm;" | »-n«  
! | »-n«  
! style="border:0.05pt solid #000000;padding:0.097cm;" | als Kommandozeilenoption besagt, dass die Ausgabe einzig die bearbeiteten Zeilen betreffen soll.  
! | als Kommandozeilenoption besagt, dass die Ausgabe einzig die bearbeiteten Zeilen betreffen soll.  
|-
|-
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding:0.097cm;" | '''Da jedoch das Flag »s« '''
| | '''Da jedoch das Flag »s« '''
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding:0.097cm;" | sämtliche Ausgaben »verschluckt«, muss »p« am Ende bemüht werden.  
| | sämtliche Ausgaben »verschluckt«, muss »p« am Ende bemüht werden.  
|-
|-
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding:0.097cm;" | '''»8,$« '''
| | '''»8,$« '''
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding:0.097cm;" | adressiert die Zeilen 8 bis zum Ende der Datei. Die erste Zeile, die also gefunden wurde, ist die 8.
| | adressiert die Zeilen 8 bis zum Ende der Datei. Die erste Zeile, die also gefunden wurde, ist die 8.
|-
|-
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding:0.097cm;" | '''»n« '''
| | '''»n« '''
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding:0.097cm;" | als Substitutionskommando bewirkt, dass die nächste Zeile bearbeitet wird - Zeile 9. Diese 9. Zeile wird nun substituiert.
| | als Substitutionskommando bewirkt, dass die nächste Zeile bearbeitet wird - Zeile 9. Diese 9. Zeile wird nun substituiert.
|-
|-
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding:0.097cm;" | '''».\{1,\}« '''
| | '''».\{1,\}« '''
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding:0.097cm;" | meint »mindestens ein (\{1,\}) beliebiges (.) Zeichen.  
| | meint »mindestens ein (\{1,\}) beliebiges (.) Zeichen.  
|-
|-
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding:0.097cm;" |  
| |  
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding:0.097cm;" | 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...  
| | 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...  
|-
|-
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding:0.097cm;" |  
| |  
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding:0.097cm;" | Sed fährt mit der folgenden Zeile (10) fort, die (wegen Flag »n«) übersprungen wird.
| | Sed fährt mit der folgenden Zeile (10) fort, die (wegen Flag »n«) übersprungen wird.
 


|-
|-
|}
|}
== {{anchor|RefHeading3008341082722535}} Zeichen tauschen [y] ==
== Zeichen tauschen [y] ==


Einzelne Zeichen lassen sich durch andere einzelne Zeichen ersetzen.  
Einzelne Zeichen lassen sich durch andere einzelne Zeichen ersetzen.  
Zeile 1.577: Zeile 1.448:


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


== {{anchor|RefHeading3008361082722535}} Sed vorzeitig beenden [q] ==
== Sed vorzeitig beenden [q] ==


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


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


== {{anchor|RefHeading3008381082722535}} Zeilentausch [h|g|G|x ] ==
== Zeilentausch [h|g|G|x ] ==


Die aktuell bearbeitete Zeile hält der Sed in einem Zwischenspeicher und bearbeitet sie in diesem »Pattern Space«.  
Die aktuell bearbeitete Zeile hält der Sed in einem Zwischenspeicher und bearbeitet sie in diesem »Pattern Space«.  
Zeile 1.609: Zeile 1.480:
Hat der Editor seine Arbeit beendet, gibt er die Zeile aus und lädt die folgende Zeile der Eingabedatei in den Zwischenspeicher.  
Hat der Editor seine Arbeit beendet, gibt er die Zeile aus und lädt die folgende Zeile der Eingabedatei in den Zwischenspeicher.  


 
{|class="wikitable"  
{| style="border-spacing:0;margin:auto;width:17.501cm;"
|-
|-
! align=center style="border-top:0.05pt solid #000000;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding:0.097cm;" | h
! align=center | h
! style="border:0.05pt solid #000000;padding:0.097cm;" | Mit dem Kommando »h« kann der aktuelle Zwischenspeicher in einen Puffer gesichert werden (»holding buffer«).  
! | Mit dem Kommando »h« kann der aktuelle Zwischenspeicher in einen Puffer gesichert werden (»holding buffer«).  
|-
|-
| align=center style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding:0.097cm;" | '''G'''
| align=center | '''G'''
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding:0.097cm;" | Das Kommando »G« fügt den Inhalt dieses Sicherungspuffers '''hinter '''der aktuell bearbeiteten Zeile ein.
| | Das Kommando »G« fügt den Inhalt dieses Sicherungspuffers '''hinter '''der aktuell bearbeiteten Zeile ein.
|-
|-
| align=center style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding:0.097cm;" | '''g'''
| align=center | '''g'''
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding:0.097cm;" | »g« '''ersetzt '''die aktuelle Zeile durch den Inhalt des Sicherungspuffers.  
| | »g« '''ersetzt '''die aktuelle Zeile durch den Inhalt des Sicherungspuffers.  
|-
|-
| align=center style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding:0.097cm;" | '''x'''
| align=center | '''x'''
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding:0.097cm;" | Den Inhalt der beiden Puffer '''vertauscht '''das Kommando »x«.  
| | Den Inhalt der beiden Puffer '''vertauscht '''das Kommando »x«.  
|-
|-
|}
|}


==== Beispiel 1 ====
==== Beispiel 1 ====


'''sed -e '/sed/{h;d;}' -e '4G' -e '4q' test.txt'''
'''sed -e '/sed/{h;d;}' -e '4G' -e '4q' test.txt'''
  1       Der Aufruf des Stream Editors besitzt immer das Format:
  1 Der Aufruf des Stream Editors besitzt immer das Format:
  2      
  2  
  4      
  4  
  3             sed 'Kommando' Dateiname
  3 sed 'Kommando' Dateiname
'''sed -e '/sed/{h;d;}' -e '4g' -e '5q' test.txt'''
'''sed -e '/sed/{h;d;}' -e '4g' -e '5q' test.txt'''
  1       Der Aufruf des Stream Editors besitzt immer das Format:
  1 Der Aufruf des Stream Editors besitzt immer das Format:
  2      
  2  
  3             sed 'Kommando' Dateiname
  3 sed 'Kommando' Dateiname
  5     Dabei kann dem Kommando mitgeteilt werden, welche Zeilen der
  5 Dabei kann dem Kommando mitgeteilt werden, welche Zeilen der


===== Erklärung =====
===== Erklärung =====
Zeile 1.645: Zeile 1.514:
* 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 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.  
* Das letzte Kommando »-e '4q'« beendet die Arbeit des Editors nach der 4. Zeile.  


==== Beispiel 2 ====
==== Beispiel 2 ====


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


===== Erklärung =====
===== Erklärung =====
Zeile 1.673: Zeile 1.540:
* Der Inhalt des Zwischenpuffers wird hinter der letzten Zeile eingefügt.  
* Der Inhalt des Zwischenpuffers wird hinter der letzten Zeile eingefügt.  


 
== Quellen ==
 
== {{anchor|RefHeading3008481082722535}} Quellen ==


* Linuxfibel (de.linwiki.org/wiki/Linuxfibel_-_Unix-Werkzeuge_-_Sed)
* Linuxfibel (de.linwiki.org/wiki/Linuxfibel_-_Unix-Werkzeuge_-_Sed)
Zeile 1.681: Zeile 1.546:
* The Geek Stuff (http://www.thegeekstuff.com/)
* The Geek Stuff (http://www.thegeekstuff.com/)


 
== Sed-Skripte ==
 
== {{anchor|RefHeading3008401082722535}} 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:  
Kompliziertere und häufig benötigte Sed-Aufrufe schreibt man besser in eine Datei. Der Aufruf von Sed sieht dann wie folgt aus:  
Zeile 1.692: Zeile 1.555:
* Vor und nach einem Kommando dürfen keine Leerzeichen, Tabulatoren... stehen  
* Vor und nach einem Kommando dürfen keine Leerzeichen, Tabulatoren... stehen  
* Mehrere Kommandos auf einer Zeile, sind sie durch Semikola voneinander zu trennen  
* 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.  
Der Stream Editor wird das gesamte Skript auf jede Zeile der Eingabedatei anwenden.  
Zeile 1.712: Zeile 1.573:


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


[[Category:Linux:Bash:Scripting]]
[[Category:Linux:Bash:Scripting]]
[[Category:Entwurf]]
[[Category:Entwurf]]

Version vom 11. Oktober 2020, 11:34 Uhr

Linux- Stream Editor – sed

Einführung

  • sed is a “non-interactive” stream-oriented editor. Since its an “non-interactive” it can be used to automate editing if desired.
  • The name sed is an abbreviation for stream editor, and the utility derives many of its commands from the ed line-editor (ed was the first UNIX text editor).
  • This allows you to edit multiple files, or to perform common editing operations without ever having to open vi or emacs.
  • sed reads from a file or from its standard input, and outputs to its standard output.
  • sed has two buffers which are called pattern buffer and hold buffer. Both are initially empty.

Arbeitsweise
aus regex-skript

Print the pattern buffer to stdout. Der Stream Editor ist kein herkömmlicher Editor wie Vi oder Emacs. Sed arbeitet nicht interaktiv; er wird mittels Kommandozeilenoptionen oder durch ein Skript gesteuert.

Sed modifiziert nicht das Original, sondern schreibt das Ergebnis auf die Standard-Ausgabe.

Die aktuell betrachtete Zeile lädt der Sed in einen temporären Puffer - nachfolgend als Arbeitspuffer bezeichnet.

Unix Sed Working methodology

This is called as one execution cycle. Cycle continues till end of file/input is reached.# Read a entire line from stdin/file.

  1. Removes any trailing newline.
  2. Places the line, in its pattern buffer.
  3. Modify the pattern buffer according to the supplied commands.

Aufruf

Der Aufruf des Stream Editors auf der Kommandozeile besitzt immer folgendes Format:

sed 'Kommando' Dateiname

Wenn man sed eine Variable übergeben möchte, eignet sich die Verwendung von doppelten Anführungszeichen. Das ist vor allem in Skripten oft der Fall.

sed "Kommando mit $Variable" Dateiname

Das hängt damit zusammen, dass die Bash den Inhalt von einfachen Anführungszeichen als reinen Text versteht. Inhalt der doppelten Anführungszeichen jedoch wird auf Sonderbedeutung überprüft.

Die doppelten Anführungszeichen haben aber auch zu Folge, dass man das $-Zeichen bei der Adressierung nicht einfach so verwenden kann.

Um die Sonderbedeutung es $-Zeichen in doppelten Anführungszeichen aufzuheben, muss ein Backslash vorangestellt werden (\$).

sed arbeitet zeilenorientiert, d.h. es liest die Eingabedatei Zeile pro Zeile und wendet auf jede Zeile den bzw. die Befehle an. Eine Zeile endet dort, wo das Zeichen "linefeed", also 0x0A steht.

Dateiübergabe an sed

Output von cat als Input von sed

cat sed-test-txt | sed [anweisungen...]

Umleitung von Stdin

sed [anweisungen...] < sed-test.txt

Dateiname als Kommandozeilenparamter

sed [anweisungen...] sed-test.txt

Ausgabe

Die Ausgabe erfolgt nach Stdout, also auf den Bildschirm. Sie kann mittels Pipe-Symbol an andere Kommandos übergeben oder in eine Datei umgeleitet werden:

Stdout ist Stdin für "less"

cat sed-test-txt | sed [anweisungen...] | less

Umleitung in Datei

cat sed-test-txt | sed [anweisungen...] > output.txt

Kommandoübersicht

Die Aktionen von Sed werden durch Kommandos gesteuert. Diese Kommandos können Zeilenangaben oder -bereiche enthalten, dann betrachtet der Editor nur die Zeilen der zu bearbeitenden Datei.

Fehlt eine solche Angabe, bearbeitet Sed die gesamte Datei.

Bevor wir das Verhalten anhand von Beispielen kennen lernen, seien alle Kommandos aufgeführt:

a Fügt eine oder mehrere Zeilen an die aktuelle Zeile an
c Ersetzt Text in der aktuellen Zeile
d Löscht Zeile(n)
g Kopiert den Inhalt eines temporären Puffers in den Arbeitspuffer (dessen alter Inhalt geht verloren)
G Fügt den Inhalt eines temporären Puffers an den Inhalt des Arbeitspuffers an
h Kopiert den Inhalt des Arbeitspuffers in einen temporären Puffer
H Fügt den Inhalt des Arbeitspuffers an einen temporären Puffer an
i Fügt Text oberhalb der aktuellen Zeile ein
l Zeigt nicht druckbare Zeichen an
n Wendet das nächste Kommando anstelle des aktuellen Kommandos auf die nächste Zeile an
p Druckt Zeile(n)
q Beendet den Editor
r Liest Zeilen aus einer Datei
! Wendet das Kommando auf Zeilen an, die nicht zutreffen

Substitutionen

Im Zusammenhang mit Substitutionen werden die Kommandos häufig als Flags bezeichnet.

Die Wirkung mancher Kommandos (»g«) wird aus dem Kontext entschieden wird.

g Globale Ersetzung (jedes Vorkommen des Musters auf der Zeile)
p Ausgabe der Zeile in Verbindung mit "s".
s Ersetzen eines Musters durch ein anderes
w Ausgabe der bearbeiteten Zeilen in eine Datei
x Austausch des Inhalts des Zwischenspeichers mit der aktuell bearbeiteten Zeile
y Ersetzen eines Zeichens durch ein anderes

Reguläre Ausdrücke

Folgende Reguläre Ausdrücke werden von sed unterstützt

^ Zeilenanfang
$ Zeilenende (bei der Adressierung steht das Zeichen für die letzte Zeile)
. Ein Zeichen (Ausnahme ist der Zeilenumbruch)
* Keine, eine oder mehrere Wiederholungen des vorhergehenden Buchstabens / der vorhergehenden Gruppe
[...] Ein Zeichen aus der Menge
[^...] Kein Zeichen aus der Menge
\(...\) Speichern des enthaltenen Musters
& Enthält das Suchmuster
\< Wortanfang
\> Wortende
x\{m\} m-fache Wiederholung des Zeichens x
x\{m,\} Mindestens m-fache Wiederholung des Zeichens x
x\{m,n\} Mindestens m-, maximal n-fache Wiederholung des Zeichens x

Beispieltexte

Die Handhabung des Stream Editors erlernen Sie vermutlich nur durch Beispiele. Zunächst soll es um die Möglichkeiten zur Adressierung von Zeilen mit Sed gehen (das Schema lässt sich u.a. auch im Vi anwenden)

cat sedtest.txt

Einrückungen?
Der Aufruf des Stream Editors besitzt immer das Format:

sed 'Kommando' Dateiname

Dabei kann dem Kommando mitgeteilt werden, welche Zeilen der
Eingabedatei es bearbeiten soll. Als Adressierung kommen folgende
Mechanismen in Frage:

Keine Angabe Alle Zeilen
Nummer Genau diese Zeile
Start, Ende Alle Zeilen von "Start" bis "Ende"
$ Symbolisiert die letzte Zeile
RegEx Zeilen, die den Regulären Ausdruck enthalten
1, RegEx Von Zeile 1 bis zur ersten Zeile, die RegEx enthält

Um die spätere Arbeit des Editors besser verfolgen zu können, nummerieren wir noch die Datei:

nl -w 2 -b a sedtest.txt | tee 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 RegEx Zeilen, die den Regulären Ausdruck enthalten
14 1, RegEx Von Zeile 1 bis zur ersten Zeile, die RegEx enthält

Erstellung einer Testdatei

cat > sed-test.txt << EOF Dies ist Zeile 1 Hier isst ein Fehler Hier isst noch ein Frhler Dies ist die vorletzte Zeile Dies ist die letzte Zeile EOF

Exkurs: Zeilen nummerieren mit nl
Beispiele einfügen

nl gibt die Zeilen einer oder mehrerer Dateien (oder der Standardeingabe) mit Zeilennummern auf die Standardausgabe.

Es können dabei die Zeilen einer (logischen) Seite in einen Kopf, einen Körper und einen Fuß unterteilt werden, die jeweils einzeln und in unterschiedlichen Stilen numeriert werden.

Jeder Teil kann auch leer sein. Wenn vor dem ersten Kopfteil bereits Zeilen vorhanden sind, werden diese Zeilen wie ein Seitenkörper numeriert.

Die Numerierung beginnt auf jeder Seite neu. Mehrere Dateien werden als ein einziges Dokument betrachtet und die Zeilennummer wird nicht zurückgesetzt.

Der Kopfteil wird durch eine Zeile eingeleitet, die nur die Zeichenkette `\:\:\:' enthält.

Der Körper wird entsprechend durch `\:\:' und der Fuß durch `\:' eingeleitet. In der Ausgabe werden diese Zeilen als Leerzeilen ausgegeben.

Optionen
-h Stil bestimmt die Art der Zeilennumerierung für die Kopfzeile; das Nummerntrennzeichen wird auch den nicht numerierten Zeilen vorangestellt; als Stil werden folgende Zeichen erkannt

a alle Zeilen

t leere Zeilen nicht (Voreinstellung für den Körper)

n Zeilen werden nicht numeriert (Voreinstellung für Kopf und Fuß)

p Ausdruck nur Zeilen, in denen der reguläre Ausdruck vorkommt,

-b Stil bestimmt die Art der Zeilennumerierung für den Körper
-f Stil bestimmt die Art der Zeilennumerierung für den Fuß
-p die Zeilen aller Seiten werden fortlaufend numeriert
-v Nummer die erste Zeile jeder logischen Seite bekommt die angegebene Nummer
-i Nummer die Schrittweite für die Numerierung
-l Nummer die angegebene Anzahl aufeinanderfolgender Leerzeilen werden als eine Zeile angesehen, und die letzte Zeile wird numeriert;

wenn weniger Leerzeilen in Folge auftreten, werden sie nicht numeriert;

Leerzeilen dürfen keine Leerzeichen oder Tabulatoren enthalten

-s Zeichenkette setzt die Zeichenkette als Nummerntrennzeichen zwischen Zeilennummer und Text; Voreinstellung ist TAB
-w Nummer die Zeilennummern erhalten die angegebene Anzahl Stellen; Voreinstellung ist 6
-n {ln, rn, rz} die Zeilennummern werden in dem angegebenen Stil ausgegeben; dabei bedeutet

ln linksbündig, ohne führende Nullen

rn rechtsbündig, ohne führende Nullen

rz rechtsbündig, mit Nullen auf die volle Stellenzahl aufgefüllt

-d zwei Zeichen die zwei Zeichen werden zur Trennung von Kopf, Körper und Fußteil benutzt, Voreinstellung ist `\:'

Aufbau der sed-Anweisungen

Aber wenn man ein paar grundlegende Dinge verstanden hat, ist es nicht schwierig. Die sed-Anweisungen werden i.A. von einfachen Hochkommas umschlossen.

sed 'anweisung' < sed-test.txt

sed kann mehrere Anweisungen in einem Durchgang abarbeiten. In diesem Falle muss jedem Befehl die Option "-e" vorangestellt werden. Wenn nur eine Anweisung abgearbeitet werden soll, kann man "-e" weglassen.

sed -e 'anweisung1' -e 'anweisung2' < sed-test.txt

möglich, aber etwas unübersichtlicher ist auch diese Form:

sed -e 'anweisung1; anweisung2' < sed-test.txt

In vielen sed-Anweisungen kommt das Zeichen '/' vor. Es ist ein Begrenzungszeichen, also ein "delimiter". Eine Regular Expression, also ein Suchausdruck, wird durch zwei Schrägstriche begrenzt. Im folgende kürze ich "Regular Expression" durch "RE" ab.

Unvollständige Anweisung:

sed '/isst/' < sed-test.txt

  • sed durchsucht die Datei Zeile pro Zeile nach dem String "isst"
  • die RE "isst" wird durch "/" am Anfang und Ende eingegrenzt.
  • "/" ist also nichts anderes als ein Begrenzungszeichen, ähnlich wie Hochkommata

Die vorige Anweisung ist unvollständig, da sie nur aus der RE '/isst/' besteht. sed muss noch mitgeteilt werden, wie mit dem Suchergebnis zu verfahren ist.

Hinter der durch die RE getroffenen Bereichsauswahl ist der Befehl anzugeben. Eine sed-Anweisung enthält also i.A. mindestens zwei Komponenten (die Bereichsauswahl kann in bestimmten Konstrukten fehlen): # Bereichsauswahl
Auswahl der Zeilen, die bearbeitet werden sollen. Im vorigen Beispiel würde sich die Auswahl auf alle Zeilen beziehen, in denen "isst" vorkommt.

  1. Befehl
    Was soll mit den ausgewählten Zeilen passieren? Der einfachste Befehl lautet "p" (print), er gibt die selektierten Zeilen am Bildschirm aus.

Das vorige Beispiel wird vervollständigt:

sed '/isst/p' < sed-test.txt

  • Durchsuchen der Datei nach Zeilen, die "isst" enthalten
  • Die selektierten Zeilen werden am Bildschirm ausgegeben
  • "/" umschließt die RE, hat also mit dem Befehl "p" nichts zu tun.

Leider liefert die sed-Anweisung ein unbefriedigendes Ergebnis, da alle Zeilen ausgegeben werden.

Dies liegt an der Arbeitsweise von sed. Um das gewünschte Ergebnis zu erhalten, muss sed mit der Option "-n" aufgerufen werden:

sed -n '/isst/p' < sed-test.txt

  • beim p-Befehl immer die Option "-n" verwenden!
  • aufgrund der Option "-n" werden nur die Zeilen ausgegeben, in denen "isst" vorkommt.

Wenn man die Option "-e" verwendet, muss beachtet weden, dass "-n" vor "-e" steht.

sed -n -e '/isst/p' < sed-test.txt

  • "-e" muss hinter "-n" stehen!

Dateizeilen ausgeben

Ausgabe [p]

Zunächst wenden wir das Kommando p auf die ersten 3 Zeilen der Datei an:

sed '1,3p' test.txt

1 Der Aufruf des Stream Editors besitzt immer das Format:
1 Der Aufruf des Stream Editors besitzt immer das Format:
2 
2 
3 sed 'Kommando' Dateiname
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 RegEx Zeilen, die den Regulären Ausdruck enthalten
14 1, RegEx Von Zeile 1 bis zur ersten Zeile, die RegEx enthält

Offensichtlich zeigt der Stream Editor etwas mehr an, als uns lieb ist; er gibt einfach die gesamte Datei aus und wiederholt nur die Zeilen, die durch das Kommando »1,3p« bearbeitet wurden.

Mehrfache Ausgaben unterbinden [-n]

Um solche »überflüssigen« Ausgaben zu unterbinden, muss die Option »-n« verwendet werden:

sed -n '1,3p' test.txt

1 Der Aufruf des Stream Editors besitzt immer das Format:
2 
3 sed 'Kommando' Dateiname

Bei der Adressierung mittels regulärer Ausdrücke müssen diese in Schrägstriche (Slashes) eingeschlossen sein:

sed -n '/RegEx/,/RegEx/p' 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

Printing Operation in Sed

is a command for printing the data from the pattern buffer.

To suppress automatic printing of pattern space use -n command with sed. sed -n option will not print anything, unless an explicit request to print is found.
Syntax:
# sed -n 'ADDRESS'p filename
# sed -n '/PATTERN/p' filename
Let us first create thegeekstuff.txt file that will be used in all the examples mentioned below.
# cat thegeekstuff.txt
1. Linux - Sysadmin, Scripting etc.
2. Databases - Oracle, mySQL etc.
3. Hardware
4. Security (Firewall, Network, Online Security etc)
5. Storage
6. Cool gadgets and websites
7. Productivity (Too many technologies to explore, not much time available)
8. Website Design
9. Software Development
10.Windows- Sysadmin, reboot etc.

Adressierung

Es ist möglich, bestimmte Zeilen explizit auszuwählen, also z.B. "Zeile 1", "Zeile 1-2", "letzte Zeile" usw. In diesem Falle wird die Bereichsauswahl direkt angegeben, sie steht also nicht zwischen "/" wie bei RE-Ausdrücken.

Der Befehl 'p' steht direkt hinter der Bereichsauswahl.

Using Address and Patterns

from a file using sed address and patterns.

“p” command prints the buffer (remember to use -n option with “p”)
  • will delete the pattern space buffer and immediately starts the next cycle.

Syntax

  • sed 'ADDRESS'd filename
  • sed /PATTERN/d filename
Syntax for ADDRESSES and PATTERNS given in the printing is applicable for deletion also, except -n option. (-n only to suppress printing pattern buffer, can be used with “p” command )
Let us first creates thegeekstuff.txt file that will be used in all the examples mentioned below.
# cat thegeekstuff.txt
1. Linux - Sysadmin, Scripting etc.
2. Databases - Oracle, mySQL etc.
3. Hardware
4. Security (Firewall, Network, Online Security etc)
5. Storage
6. Cool gadgets and websites
7. Productivity (Too many technologies to explore, not much time available)
8. Website Design
9. Software Development
10.Windows- Sysadmin, reboot etc.

ADDRESS Format Beispiele

NUMBER

This will match only Nth line in the input.

# sed -n ‘N’p filename

For example, 3p prints third line of input file thegeekstuff.txt as shown below.

# sed -n '3'p thegeekstuff.txt 3. Hardware

Erste Zeile ausgeben

sed -n '1p' < sed-test.txt

Option "-n" nicht vergessen!

NUMBER1~NUMBER2

M~N with “p” command prints every Nth line starting from line M.

# sed -n ‘M~N’p filename

For example, 3~2p prints every 2nd line starting from 3rd line as shown below.
# sed -n '3~2'p thegeekstuff.txt
3. Hardware
5. Storage
7. Productivity (Too many technologies to explore, not much time available)
9. Software Development

START, END

M,N with “p” command prints Mth line to Nth line.

# sed -n ‘M,N’p filename

For example, 4,8p prints from 4th line to 8th line from input file thegeekstuff.txt
# sed -n '4,8'p thegeekstuff.txt
4. Security (Firewall, Network, Online Security etc)
5. Storage
6. Cool gadgets and websites
7. Productivity (Too many technologies to explore, not much time available)
8. Website Design

‘$’ Last Line

$ with “p” command matches only the last line from the input.

# sed -n ‘$’p filename

For example, $p prints only the last line as shown below.
# sed -n '$'p thegeekstuff.txt
10.Windows- Sysadmin, reboot etc.

NUMBER,$

N,$ with “p” command prints from Nth line to end of file.

# sed -n ‘N,$p’ filename

For example 4,$p prints from 4th line to end of file.
# sed -n '4,$p' thegeekstuff.txt
4. Security (Firewall, Network, Online Security etc)
5. Storage
6. Cool gadgets and websites
7. Productivity (Too many technologies to explore, not much time available)
8. Website Design
9. Software Development
10.Windows- Sysadmin, reboot etc.
Letzte Zeile ausgeben

sed -n '$p' < sed-test.txt

PATTERN Format Beispiele

PATTERN

PATTERN could be unix regular expression. The below command prints only the line which matches the given pattern.

# sed -n /PATTERN/p filename

For example, following prints the line only which matches the pattern “Sysadmin”.
# sed -n /Sysadmin/p thegeekstuff.txt
1. Linux - Sysadmin, Scripting etc.
10.Windows- Sysadmin, reboot etc.

/PATTERN/,ADDRESS

# sed -n ‘/PATTERN/,Np’ filename

For example, following prints lines which matches the pattern to Nth line, from input. 3rd line matches the pattern “Hardware”, so it prints from 3rd line to 6th line.
# sed -n '/Hardware/,6p' thegeekstuff.txt
3. Hardware
4. Security (Firewall, Network, Online Security etc)
5. Storage
6. Cool gadgets and websites

ADDRESS,/PATTERN/

It prints from the Nth line of the input, to the line which matches the pattern. If the pattern doesnt match, it prints upto end of the input.

# sed -n ‘N,/PATTERN/p’ filename

For example, 4th line matches the pattern “Security”, so it prints from 3rd line to 4th line.
# sed -n '3,/Security/p' thegeekstuff.txt
3. Hardware
4. Security (Firewall, Network, Online Security etc)

/PATTERN/,$

It prints from the line matches the given pattern to end of file.

# sed -n ‘/PATTERN/,$p’ filename

# sed -n '/Website/,$p' thegeekstuff.txt
8. Website Design
9. Software Development
10.Windows- Sysadmin, reboot etc.

/PATTERN/,+N

It prints the lines which matches the pattern and next N lines following the matched line.

# sed -n ‘/PATTERN/,+Np’ filename

For example, following prints the 5th line which matches the pattern /Storage/ and next two lines following /Storage/.
# sed -n '/Storage/,+2p' thegeekstuff.txt
5. Storage
6. Cool gadgets and websites
7. Productivity (Too many technologies to explore, not much time available)

/PATTERN/,/PATTERN/

Prints the section of file between two regular expression (including the matched line ).

# sed -n ‘/P1/,/P2/p’ filename

For example, 5th line matches “Storage” and 8th line matches “Design”, so it prints 5th to 8th.
# sed -n '/Storage/,/Design/p' thegeekstuff.txt
5. Storage
6. Cool gadgets and websites
7. Productivity (Too many technologies to explore, not much time available)
8. Website Design

Besondere Zeichen

Negation

Das Ausrufezeichen ("!") hinter der Bereichsauswahl bewirkt eine Negation

sed '/isst/!d' < sed-test.txt

  • Zeilen, die "isst" nicht enthalten, werden nicht ausgegeben

sed -n '1!p' < sed-test.txt

  • alle Zeilen außer Zeile 1 werden ausgegeben

$-Zeichen: letztes Element

Das $-Zeichen steht bei der Bereichsauswahl für "letzte Zeile":

sed -n '$p' < sed-test.txt

  • letzte Zeile ausgeben

In einer RE steht das $-Zeichen für "Zeilenende"

sed -n '/Zeile$/p' < sed-test.txt

  • Zeilen ausgeben, in denen "Zeile" am Ende steht

Möchte man dem Zeilenende eine Zeichenkette anhängen, genügt ein $ als Suchmuster:

sed -n 's/$/ und Schluss!/p' < sed-test.txt

  • Jede Zeile endet mit ' und Schluss!'

^ - Zeichen

Das ^-Zeichen steht in einer RE für Zeilenanfang:

sed -n '/^Hier/p' < sed-test.txt

  • Zeilen ausgeben, in denen "Hier" am Anfang steht

Innerhalb einer Zeichenklasse in einer RE steht es für Verneinung.

sed -n '/F[^e]hler/p' < sed-test.txt

  • Zeilen ausgeben, in denen das Wort "F.hler" vorkommt, wobei der 2. Buchstabe kein "e" sein darf

Möchte man dem Zeilenanfang eine Zeichenkette voranstellen genügt ein ^ als Suchmuster:

sed -n 's/^/Am Anfang stand /p' < sed-test.txt

  • Jede Zeile beginnt mit 'Am Anfang stand '

Zeilen löschen

Löschen [d]

Der nachfolgende Aufruf löscht alle Zeilen ab der (einschließlich) 4. bis zum Dateiende:

sed '4,$d' test.txt

1 Der Aufruf des Stream Editors besitzt immer das Format:
2 
3 sed 'Kommando' Dateiname

Das Entfernen aller Zeilen, die mit einem Leerzeichen beginnen, erledigt dieser Aufruf:

sed '/^ /d' test.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

Der delete-Befehl ist die Umkehrung des print-Befehls: Die bei der Bereichsauswahl (mittels RE oder explizit) selektierten Zeilen werden "gelöscht", also nicht ausgegeben.

sed '/isst/d' < sed-test.txt

  • Zeilen, die "isst" enthalten, werden nicht ausgegeben

sed '3d' < sed-test.txt

  • die dritte Zeile wird nicht ausgegeben

Beispiele

Lösche die Nte Zeile

‘Nd’ deletes the Nth line and prints the other lines.

sed ‘Nd’ filename

It reads the first line and places in its pattern buffer.
  • Check whether supplied command is true for this line, if true, deletes pattern space buffer and starts next cycle. i.e Read next line.
  • If supplied command doesnt true, as its normal behaviour it prints the content of the pattern space buffer.
For example, 3d deletes 3rd line and prints other lines as shown below.
sed 3d thegeekstuff.txt
1. Linux - Sysadmin, Scripting etc.
2. Databases - Oracle, mySQL etc.
4. Security (Firewall, Network, Online Security etc)
5. Storage
6. Cool gadgets and websites
7. Productivity (Too many technologies to explore, not much time available)
8. Website Design
9. Software Development
10.Windows- Sysadmin, reboot etc.

Delete Starting from 3rd line and every 2nd line from there.

sed '3~2d' thegeekstuff.txt
1. Linux - Sysadmin, Scripting etc.
2. Databases - Oracle, mySQL etc.
4. Security (Firewall, Network, Online Security etc)
6. Cool gadgets and websites
8. Website Design
10.Windows- Sysadmin, reboot etc.

Delete from 4th to 8th line from file.

sed '4,8d' thegeekstuff.txt
1. Linux - Sysadmin, Scripting etc.
2. Databases - Oracle, mySQL etc.
3. Hardware
9. Software Development
10.Windows- Sysadmin, reboot etc.

Delete the last line from input.

sed '$d' thegeekstuff.txt
1. Linux - Sysadmin, Scripting etc.
2. Databases - Oracle, mySQL etc.
3. Hardware
4. Security (Firewall, Network, Online Security etc)
5. Storage
6. Cool gadgets and websites
7. Productivity (Too many technologies to explore, not much time available)
8. Website Design
9. Software Development

Delete the line which matches the given pattern from input.

For example, the below command deletes the line which matches with “Sysadmin”.
sed /Sysadmin/d thegeekstuff.txt
2. Databases - Oracle, mySQL etc.
3. Hardware
4. Security (Firewall, Network, Online Security etc)
5. Storage
6. Cool gadgets and websites
7. Productivity (Too many technologies to explore, not much time available)
8. Website Design
9. Software Development

Deletes the line from which matches the given pattern to end of the file.

sed '/Website/,$d' thegeekstuff.txt
1. Linux - Sysadmin, Scripting etc.
2. Databases - Oracle, mySQL etc.
3. Hardware
4. Security (Firewall, Network, Online Security etc)
5. Storage
6. Cool gadgets and websites
7. Productivity (Too many technologies to explore, not much time available)

Deletes the line from which matches the given pattern and 2lines next to that.

sed '/Storage/,+2d' thegeekstuff.txt
1. Linux - Sysadmin, Scripting etc.
2. Databases - Oracle, mySQL etc.
3. Hardware
4. Security (Firewall, Network, Online Security etc)
8. Website Design
9. Software Development
10.Windows- Sysadmin, reboot etc.

Delete blank Line from a file using sed

You can also remove blank lines with sed. The following sed example shows how to use sed and remove blank lines.
sed '/^$/d' thegeekstuff.txt
1. Linux - Sysadmin, Scripting etc.
2. Databases - Oracle, mySQL etc.
3. Hardware
4. Security (Firewall, Network, Online Security etc)
5. Storage
6. Cool gadgets and websites
7. Productivity (Too many technologies to explore, not much time available)
8. Website Design
9. Software Development
10.Windows- Sysadmin, reboot etc.

Suchen und Ersetzen

In diesem Falle steht das Trennzeichen "/" an drei Stellen: vor und hinter der RE, also dem Suchmuster und hinter dem Ersetzungsmuster.

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«.
    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, z.B. von DOS- (CR-LF) zu Unix 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 is an example. This is an example.

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 z.B. 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'

  1. Ersetzung1
  2. 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, z.B. 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.

Quellen

  • Linuxfibel (de.linwiki.org/wiki/Linuxfibel_-_Unix-Werkzeuge_-_Sed)
  • Dokumentation zu GNU sed (www.gnu.org/software/sed/manual/sed.html)
  • The Geek Stuff (http://www.thegeekstuff.com/)

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