sed Stream Editor in der Praxis

sed – Beispiele aus der Praxis

 

 

# Doppelter Zeilenvorschub
 sed G

 # Doppelter Zeilenabstand für Dateien, die Leerzeilen enthalten.
 # Die Ausgabe sollte keine zwei aufeinander folgenden Leerzeilen enthalten.
 sed '/^$/d;G'

 # Dreifacher Zeilenvorschub
 sed 'G;G'

 # Doppelter Zeilenvorschub rückgängig machen
 # (Annahme: jede zweite Zeile ist leer)
 sed 'n;d'

 # Füge eine Leerzeile über jeder Zeile ein, die "regex" enthält
 sed '/regex/{x;p;x;}'

 # Füge eine Leerzeile unter jeder Zeile ein, die "regex" enthält
 sed '/regex/G'

 # Füge eine Leerzeile über und unter jeder Zeile ein, die "regex" enthält
 sed '/regex/{x;p;x;G;}'

Nummerierung

 # Nummeriere alle Zeilen (linksbündig). Der Tabulator anstelle von Leerzeichen
 # erhält den Rand. (siehe auch die Bemerkung zu '\t' am Ende dieser Datei)
 sed = filename | sed 'N;s/\n/\t/'

 # Nummeriere alle Zeilen (Zahl rechtsbündig in linker Spalte)
 sed = filename | sed 'N; s/^/     /; s/ *\(.\{6,\}\)\n/\1  /'

 # Nummeriere alle Zeilen, aber die Nummern von Leerzeilen werden nicht ausgegeben.
 sed '/./=' filename | sed '/./N; s/\n/ /'

 # Zeilen zählen (Nachahmung von "wc -l")
 sed -n '$='

TEXT UMWANDLUNG UND ERSETZUNG:

 # IN EINER UNIX UMGEBUNG: Wandle DOS Zeilenvorschübe (CR/LF) in das Unix-Format.
 sed 's/.$//'               # Annahme: Alle Zeilen enden mit CR/LF
 sed 's/^M$//'              # Bei bash/tcsh: Ctrl-V dann Ctrl-M
 sed 's/\x0D$//'            # für ssed, gsed 3.02.80 oder neuere Versionen

 # IN EINER UNIX UMGEBUNG: Wandle Unix Zeilenvorschübe (LF) in das DOS-Format.
 sed "s/$/`echo -e \\\r`/"            # ksh
 sed 's/$'"/`echo \\\r`/"             # bash
 sed "s/$/`echo \\\r`/"               # zsh
 sed 's/$/\r/'                        # gsed 3.02.80 oder neuere Versionen

 # IN EINER DOS UMGEBUNG: Wandle Unix Zeilenvorschübe (LF) in das DOS-Format.
 sed "s/$//"                          # Möglichkeit 1
 sed -n p                             # Möglichkeit 2

 # IN EINER DOS UMGEBUNG: Wandle DOS Zeilenvorschübe (CR/LF) in das Unix-Format.
 # Die kann mit mit der UnxUtils Version von sed, Version 4.0.7 oder neuer
 # gemacht werden. Die UnxUtils Version von sed kann durch die zusätzliche
 # "--text" Option bestimmt werden, die beim Aufruf mit "--help" angezeigt wird.
 # Ansonsten kann die Umwandlung von DOS-Zeilenvorschüben in UNIX-Zeilenvorschübe
 # nicht mit sed unter DOS vorgenommen werden. Benutzen Sie stattdessen "tr".
 sed "s/\r//" infile >outfile         # UnxUtils sed v4.0.7 oder neuer
 tr -d \r <infile >outfile            # GNU tr Version 1.22 oder neuer

 # Lösche alle Einrückungen (Leerzeichen, Tabulatoren) vom Anfang jeder Zeile
 # Richtet alle Zeilen linksbündig aus.
 sed 's/^[ \t]*//'                    # (siehe auch die Bemerkung zu '\t' am Ende dieser Datei)

 # Lösche unsichtbare Zeichen (Leerzeichen, Tabulatoren) vom Ende aller Zeilen
 sed 's/[ \t]*$//'                    # (siehe auch die Bemerkung zu '\t' am Ende dieser Datei)

 # Lösche unsichtbare Zeichen sowohl am Anfang als auch am Ende jeder Zeile
 sed 's/^[ \t]*//;s/[ \t]*$//'

 # Füge 5 Leerzeichen am Anfang jeder Zeile ein. (Einrückung)
 sed 's/^/     /'

 # Alle Zeilen rechtsbündig ausrichten (Spaltenbreite: 79 Zeichen)
 sed -e :a -e 's/^.\{1,78\}$/ &/;ta'  # set at 78 plus 1 space

 # Zentriere alle Zeilen in einer 79-Zeichen breiten Spalte.
 # Bei Methode 1 bleiben Leerzeichen am Zeilenanfang und -ende erhalten.
 # Bei Methode 2 werden Leerzeichen am Zeilenanfang gelöscht und es
 # folgen keine Leerzeichen am Zeilenende.
 sed  -e :a -e 's/^.\{1,77\}$/ & /;ta'                     # Möglichkeit 1
 sed  -e :a -e 's/^.\{1,77\}$/ &/;ta' -e 's/\( *\)\1/\1/'  # Möglichkeit 2

 # Ersetze (Suchen und Ersetzen) "foo" mit "bar" in jeder Zeile
 sed 's/foo/bar/'                    # Ersetzt nur das 1. Vorkommen pro Zeile
 sed 's/foo/bar/4'                   # Ersetzt nur das 4. Vorkommen pro Zeile
 sed 's/foo/bar/g'                   # Ersetzt ALLE Vorkommen von "foo" mit "bar"
 sed 's/\(.*\)foo\(.*foo\)/\1bar\2/' # Ersetzt nur das vorletzte Vorkommen pro Zeile
 sed 's/\(.*\)foo/\1bar/'            # Ersetzt nur das letzte Vorkommen pro Zeile


 # Ersetze "foo" mit "bar" NUR in Zeilen die "baz" enthalten
 sed '/baz/s/foo/bar/g'

 # Ersetze "foo" mit "bar" AUSSER in Zeilen die "baz" enthalten
 sed '/baz/!s/foo/bar/g'

 # Ersetze "scarlet", "ruby" oder "puce" mit "red"
 sed 's/scarlet/red/g;s/ruby/red/g;s/puce/red/g'   # Die meisten seds
 gsed 's/scarlet\|ruby\|puce/red/g'                # Nur GNU sed 

 # Kehre die Reihenfolge der Zeilen um (entspricht "tac")
 # Bug/Feature in HHsed v1.5 löscht hierbei Leerzeilen
 sed '1!G;h;$!d'               # Möglichkeit 1
 sed -n '1!G;h;$p'             # Möglichkeit 2

 # Kehre die Reihenfolge der Buchstaben innerhalb jeder Zeile um (entspricht "rev")
 sed '/\n/!G;s/\(.\)\(.*\n\)/&\2\1/;//D;s/.//'

 # Füge Zeilenpaare nebeneinander zusammen (entspricht "paste")
 sed '$!N;s/\n/ /'

 # Falls eine Zeile mit einem Rückwärtsstrich "\" endet, füge die nächste hinzu.
 sed -e :a -e '/\\$/N; s/\\\n//; ta'

 # Falls eine Zeile mit einem Gleichheitszeichen "=" beginnt, 
 # füge die vorhergehende hinzu und ersetzt das "=" mit einem Leerzeichen.
 sed -e :a -e '$!N;s/\n=/ /;ta' -e 'P;D'

 # Füge Kommas in Zahlenfolgen ein. Aus "1234567" wird "1,234,567"
 gsed ':a;s/\B[0-9]\{3\}\>/,&/;ta'                     # GNU sed
 sed -e :a -e 's/\(.*[0-9]\)\([0-9]\{3\}\)/\1,\2/;ta'  # Andere seds

 # Füge Kommas in Zahlenfolgen mit Dezimalpunkt und Vorzeichen ein.  (GNU sed)
 gsed -r ':a;s/(^|[^0-9.])([0-9]+)([0-9]{3})/\1\2,\3/g;ta'

 # Füge alle 5 Zeilen eine Leerzeile ein. (Nach 5, 10, 15, 20,... Zeilen)
 gsed '0~5G'                  # GNU sed
 sed 'n;n;n;n;G;'             # andere seds

DRUCKEN AUSGEWÄHLTER ZEILEN:

 # Ausgabe der ersten 10 Zeilen einer Datei (wie "head")
 sed 10q

 # Ausgabe der ersten Zeilen einer Datei (wie "head -1")
 sed q

 # Ausgabe der letzten 10 Zeilen einer Datei (wie "tail")
 sed -e :a -e '$q;N;11,$D;ba'

 # Ausgabe der letzten beiden Zeilen einer Datei (wie "tail -2")
 sed '$!N;$!D'

 # Ausgabe der letzten Zeilen einer Datei (wie "tail -1")
 sed '$!d'                    # Möglichkeit 1
 sed -n '$p'                  # Möglichkeit 2

 # Ausgabe der vorletzten Zeile einer Datei
 sed -e '$!{h;d;}' -e x              # Bei einzeiligen Dateien wird eine Leerzeile ausgegeben
 sed -e '1{$q;}' -e '$!{h;d;}' -e x  # Bei einzeiligen Dateien wird die Zeile ausgegeben
 sed -e '1{$d;}' -e '$!{h;d;}' -e x  # Bei einzeiligen Dateien wird nichts ausgegeben

 # Ausgabe der Zeilen, die durch den Regulären Ausdruck (Regex) definiert sind (wie "grep")
 sed -n '/regexp/p'           # Möglichkeit 1
 sed '/regexp/!d'             # Möglichkeit 2

 # Ausgabe der Zeilen, die den Reguläre Ausdruck NICHT erfüllen (wie "grep -v")
 sed -n '/regexp/!p'          # Möglichkeit 1, entspricht obiger Lösung
 sed '/regexp/d'              # Möglichkeit 2, Einfacher Syntax

 # Ausgabe der Zeile direkt oberhalb des Regex, jedoch nicht die Zeile 
 # die den Regex erfüllt.
 sed -n '/regexp/{g;1!p;};h'

 # Ausgabe der Zeile direkt unterhalb des Regex, jedoch nicht die Zeile 
 # die den Regex erfüllt.
 sed -n '/regexp/{n;p;}'

 # Ausgabe eine umgebende Zeile vor und nach der Regex, mit Angabe
 # der Zeilennummer der Zeile, die den Regex erfüllt. (ähnlich "grep -A1 -B1")
 sed -n -e '/regexp/{=;x;1!p;g;$!N;p;D;}' -e h

 # Suche nach AAA und BBB und CCC (in beliebiger Reihenfolge)
 sed '/AAA/!d; /BBB/!d; /CCC/!d'

 # Suche nach AAA und BBB und CCC (in vorgegebener Reihenfolge)
 sed '/AAA.*BBB.*CCC/!d'

 # Suche nach AAA oder BBB oder CCC (wie "egrep")
 sed -e '/AAA/b' -e '/BBB/b' -e '/CCC/b' -e d    # die meisten seds
 gsed '/AAA\|BBB\|CCC/!d'                        # GNU sed

 # Ausgabe des Absatzes falls dieser AAA enthält (Leerzeilen trennen Absätze)
 # Für HHsed v1.5 muss 'G;' nach 'x;' eingefügt werden.
 sed -e '/./{H;$!d;}' -e 'x;/AAA/!d;'

 # Ausgabe des Absatzes falls dieser AAA, BBB und CCC enthält. (Reihenfolge egal)
 # Für HHsed v1.5 muss 'G;' nach 'x;' eingefügt werden.
 sed -e '/./{H;$!d;}' -e 'x;/AAA/!d;/BBB/!d;/CCC/!d'

 # Ausgabe des Absatzes falls dieser AAA, BBB oder CCC enthält.
 # Für HHsed v1.5 muss 'G;' nach 'x;' eingefügt werden.
 sed -e '/./{H;$!d;}' -e 'x;/AAA/b' -e '/BBB/b' -e '/CCC/b' -e d
 gsed '/./{H;$!d;};x;/AAA\|BBB\|CCC/b;d'         # nur GNU sed 

 # Ausgabe der Zeilen die 65 Zeichen lang oder länger sind
 sed -n '/^.\{65\}/p'

 # Ausgabe der Zeilen die kürzer als 65 Zeichen sind
 sed -n '/^.\{65\}/!p'        # Möglichkeit 1, entspricht obiger Lösung
 sed '/^.\{65\}/d'            # Möglichkeit 2, eifacherer Syntax

 # Ausgabe der Datei ab dem regulären Ausdruck bis zum Ende
 sed -n '/regexp/,$p'

 # Ausgabe eines Abschnittes der Datei, der durch Zeilennummern definiert ist
 # (hier: 8-12, inklusive)
 sed -n '8,12p'               # Möglichkeit 1
 sed '8,12!d'                 # Möglichkeit 2

 # Ausgabe von Zeile 52
 sed -n '52p'                 # Möglichkeit 1
 sed '52!d'                   # Möglichkeit 2
 sed '52q;d'                  # Möglichkeit 3, effizient für große Dateien

 # Ausgabe jeder 7. Zeile - beginnend bei Zeile 3
 gsed -n '3~7p'               # nur GNU sed
 sed -n '3,${p;n;n;n;n;n;n;}' # andere seds

 # Ausgabe des Teils der Datei, der zwischen den regulären Ausdrücken ist (inklusive der Regexs)
 sed -n '/Iowa/,/Montana/p'             # berücksichtigt die Groß/Kleinschreibung

LÖSCHUNG BESTIMMTER ZEILEN:

 # Ausgabe der Datei, AUSSER dem Teil, der zwischen den regulären Ausdrücken ist
 sed '/Iowa/,/Montana/d'

 # Löschung von aufeinander folgenden, identischen Zeilen (wie "uniq").
 # Die erste Zeile in einer Folge von Duplikaten wird ausgegeben, der Rest gelöscht.
 sed '$!N; /^\(.*\)\n\1$/!P; D'

 # Lösche identische, nicht aufeinander folgende Zeilen einer Datei.
 # Achten Sie darauf nicht die Buffer-größe des "Hold-spaces" zu überschreiten oder benutzen Sie GNU sed.
 sed -n 'G; s/\n/&&/; /^\([ -~]*\n\).*\n\1/d; s/\n//; h; P'

 # Löscht alle Zeilen außer Duplikate (wie "uniq -d").
 sed '$!N; s/^\(.*\)\n\1$/\1/; t; D'

 # Löscht die ersten 10 Zeilen einer Datei
 sed '1,10d'

 # Löscht die letzte Zeile einer Datei
 sed '$d'

 # Löscht die zwei letzten Zeilen einer Datei
 sed 'N;$!P;$!D;$d'

 # Löscht die 10 letzten Zeilen einer Datei
 sed -e :a -e '$d;N;2,10ba' -e 'P;D'   # Möglichkeit 1
 sed -n -e :a -e '1,10!{P;N;D;};N;ba'  # Möglichkeit 2

 # Lösche jede 8. Zeile
 gsed '0~8d'                           # nur GNU sed
 sed 'n;n;n;n;n;n;n;d;'                # andere seds

 # Lösche Zeilen die die Regex erfüllen
 sed '/pattern/d'

 # Lösche ALLE Leerzeilen aus einer Datei (wie "grep '.' ")
 sed '/^$/d'                           # Möglichkeit 1
 sed '/./!d'                           # Möglichkeit 2

 # Lösche alle AUFEINANDER FOLGENDEN Leerzeilen außer der ersten;
 # außerdem, lösche alle Leerzeilen am Anfang und am Ende der Datei 
 # (Wie "cat -s")
 sed '/./,/^$/!d'          # Möglichkeit 1, lässt 0 Leerzeilen am Anfang, 1 am Ende der Datei
 sed '/^$/N;/\n$/D'        # Möglichkeit 2, lässt 1 Leerzeilen am Anfang, 0 am Ende der Datei

 # Lösche alle AUFEINANDER FOLGENDEN Leerzeilen, außer die ersten 2:
 sed '/^$/N;/\n$/N;//D'

 # Lösche alle Leerzeilen am Anfang einer Datei
 sed '/./,$!d'

 # Lösche alle Leerzeilen am Ende einer Datei
 sed -e :a -e '/^\n*$/{$d;N;ba' -e '}'  # funktioniert bei allen seds
 sed -e :a -e '/^\n*$/N;/\n$/ba'        # ditto, außer bei gsed 3.02.*

 # Lösche die letzte Zeile jedes Absatzes
 sed -n '/^$/{p;h;};/./{x;/./p;}'

SPEZIELLE EINSATZGEBIETE:

 # Entferne nroff "overstrikes" (char, Rückschritt) aus Man-Seiten.
 # Die 'echo' Anweisung braucht eventuell die Option -e für die Unix System V shell oder bash.
 sed "s/.`echo \\\b`//g"    # Doppelte Anfürungszeichen werden in Unix-Umgebungen benötigt.
 sed 's/.^H//g'             # In bash/tcsh, Ctrl-V und dann Ctrl-H drücken
 sed 's/.\x08//g'           # Hex-Angabe für sed 1.5, GNU sed, ssed

 # nur die Usenet/E-Mail Kopfzeilen
 sed '/^$/q'                # Löscht alles nach der ersten Leerzeile

 # nur die Usenet/E-Mail Nachrichtentext
 sed '1,/^$/d'              # Löscht alles bis zur ersten Leerzeile

 # Die Betreffzeile einer E-Mail, aber ohne das "Subject: " am Zeilenanfang
 sed '/^Subject: */!d; s///;q'

 # Die Antwortadresse einer E-Mail
 sed '/^Reply-To:/q; /^From:/h; /./d;g;q'

 # Extrahiert die E-Mail-Adresse aus der Antwortadresse des vorherigen Scripts
 sed 's/ *(.*)//; s/>.*//; s/.*[:<] *//'

 # Ein Größer-Zeichen an jedem Zeilenanfang einfügen (Nachricht zitieren)
 sed 's/^/> /'

 # Größerzeichen am Zeilananfang löschen (Macht vorheriges script rückgängig)
 sed 's/^> //'

 # Entferne die meisten HTML-Auszeichnungen (inklusive die über mehrere Zeilen)
 sed -e :a -e 's/<[^>]*>//g;/</N;//ba'

 # Multi-part uuencodierte Binärdateien auspacken
 # und fehlerhafte Kopfzeilen entfernen, so dass nur die uuencodierten Daten 
 # übrig bleiben.
 # Die übergebenen Dateien müssen in der richtigen Reihenfolge sein.
 # Möglichkeit 1 kann auf der Kommandozeile ausgeführt werden,
 # Möglichkeit 2 kann als Unix-Shell-Script ausgeführt werden. (Basierend auf einem Script von Rahul Dhesi)
 sed '/^end/,/^begin/d' file1 file2 ... fileX | uudecode   # Möglichkeit 1
 sed '/^end/,/^begin/d' "$@" | uudecode                    # Möglichkeit 2

 # Sortiere die Absätze der Datei alphabetisch. Absätze werden durch Leerzeilen getrennt.
 # GNU sed benutzt \v als vertikale Tabulatoren (Alternativ kann auch jedes andere, 
 # eindeutige Zeichen verwendet werden)
 sed '/./{H;d;};x;s/\n/={NL}=/g' file | sort | sed '1s/={NL}=//;s/={NL}=/\n/g'
 gsed '/./{H;d};x;y/\n/\v/' file | sort | sed '1s/\v//;y/\v/\n/'
Bookmark and Share