Optionen und Kommandos

Verwirrenderweise verfügen sowohl Sed (siehe Tabelle "Sed-Optionen") als auch die internen Editierkommandos (Tabelle "Editierkommandos") über eigene Optionen. Wie im Linux-Leben allgemein üblich, teilen Sie dem Stream-Editor die Optionen mit vorangestelltem Minus-Zeichen mit. Den Editieranweisungen übergeben Sie ihre Optionen am Ende des Aufrufs (Tabelle "Optionen der Editierkommandos").

Sed-Optionen

Aktion Option
Angabe auszuführender Befehle (Angabe meist unnötig) -e
Auf Datenpufferung verzichten -u
Dateien separat behandeln -s
Erweiterte reguläre Ausdrücke verwenden -r
Sicherungsdatei anlegen -i[Endung]
Skript-Datei einlesen und ausführen -f Skript
Unterdrücken der (nicht betroffenen) Textbereiche -n
Versionsabfrage -v

Editierkommandos

Aktion Kommando
Anfügen von Zeilen oberhalb der angegebenen Stelle i
Anfügen von Zeilen unterhalb der angegebenen Stelle a
Ausgabe der angegebenen Zeilen p
Ausgabe der angegebenen Zeilen optional mit Längenbegrenzung l [Länge]
Austausch von Zeichen y
Sed beenden q
Ersetzen von Text in der angegebenen Zeile c
Löschen der angegebenen Zeilen d
Suchen und Ersetzen s

Optionen der Editierkommandos

Aktion Option
Ausgabe der Zeilennummer =
Betrifft alle Vorkommen g
Gibt beim Editierkommando s die geänderte Zeile aus p
Schreiben der bearbeiteter Zeilen in die Datei w

Die Suchfunktion benötigen Sie unter anderem für das Ersetzen von Textteilen. Die Suchangabe stellt hierbei die Adressierung dar. Mithilfe der bereits angesprochenen regulären Ausdrücke erweitern sie die Angaben um Suchmuster. Die Tabelle "Suchmuster und Adressangaben" zeigt als Grundlage eine kleine Auswahl der Möglichkeiten. Einige Praxisbeispiele finden Sie in der Tabelle "Beispielsuchen und Suchmuster". Sie enthält Fälle, in denen Sed ein Teil des Datenstrom darstellt, als auch Situationen, in denen Sed direkt auf eine Textdatei zugreift.

Suchmuster und Adressangaben

Aktion Muster
Alle Zeilen (ohne)
Zeile 25 25
Nicht Zeile 25 25!
Zeilen 10 bis 20 10,20
Letzte Zeile $
Nicht Suchmuster '/Muster/!'
Zeichen am Zeilenanfang ^Zeichen
Zeichenkette /Zeichenkette/
Zeichenmenge [Zeichenmenge]
beliebige Buchstaben [:alpha:]
Kleinbuchstaben [:lower:]
Großbuchstaben [:upper:]
alphanumerische Zeichen [:alnum:]
Zahlen [:digit:]
Hexadezimalzahlen [:xdigit:]
Tabulatoren und Leerzeichen [:blank:]
Leerzeichen [:space:]
Steuerzeichen [:cntrl:]
Druckbare Zeichen (ohne Steuerzeichen) [:print:]
Sichtbare Zeichen (ohne Leertaste) [:graph:]
Satzzeichen [:punct:]

Beispielsuchen und Suchmuster

Gesucht Suchmuster Beispiel Listing
Begriff, Name '/Begriff/' cat textdatei.txt | sed -n '/Meier/p'
alle Namen, die "han" oder "Han" beinhalten '/[Hh]an/p' sed -n '/[Hh]an/p' textdatei.txt 5
Alle Zeilen außer 3 bis 5 '3,5!' sed -n '3,5!'p textdatei.txt 6
Alle Zeilen, die nicht "Gans" enthalten '/Gans/!' sed -n '/Gans/!'p textdatei.txt 7
Zeilen, die "H" oder "G" enthalten '/[H|G]/' sed -n '/[H|G]/'p textdatei.txt
Zeilen, die "H" oder "G" nicht enthalten '/[H]\|[G]/!' sed -n '/[H]\|[G]/!'p textdatei.txt 8
Zeile 3 3 cat textdatei.txt | sed -n '3p'
Letzte Zeile '$p' cat textdatei.txt | sed -n '$p'
Zeilen nicht ausgeben, die "H" und in der Folge "J" enthalten '/[H]./,/[J]./!' sed -n '/[H]./,/[J]./!'p textdatei.txt 9
Alle Zeilen, die alphanumerische Zeichen enthalten (Leerzeilen unterdrücken) '/[:alnum:]/' cat textdatei.txt | sed -n '/[:alnum:]/'p 10

Bei zusammengesetzten Adressangaben (ab zwei Suchmustern) verarbeitet Sed alle Zeilen außer der ersten, auf die die erste Adresse zutrifft, bis einschließlich der nächsten Zeile, auf die die zweite Adresse passt. Beachten Sie hierbei das Beispiel aus Listing 9: In der Textdatei textdatei.txt steht ein Eintrag mit kleinem "j" vor dem mit "J". Das entsprechende Sed-Kommando aus Tabelle "Beispielsuchen und Suchmuster" soll alle Zeilen ausgeben, die "H" und "J" enthalten. In diesem Fall funktioniert das, da die Reihenfolgen im Befehl und in der Textdatei übereinstimmen. Das zweite Beispiel mit den negierten Zeichen "H" und "j" zeigt aber, dass Sed zuerst eine Zeile mit "H" finden muss. Daher gibt Sed den "johann" aus der ersten Zeile trotz des Suchfilters aus.

Listing 5

$ sed -n '/[Hh]an/p' textdatei.txt
johann johannson  0885465468798746
Hans Michael  0987654321
Jochen Hansen  0405458765143321

Listing 6

$ sed -n '3,5!'p textdatei.txt
johann johannson  0885465468798746
Gabi Gans Meier   0548/9988776655

Listing 7

$ sed -n '/Gans/!'p textdatei.txt
johann johannson  0885465468798746
Klaus Schraube  08755466584
Hans Michael  0987654321
Jochen Hansen  0405458765143321

Listing 8

$ sed -n '/[H]\|[G]/!'p textdatei.txt
johann johannson  0885465468798746
Klaus Schraube  08755466584

Listing 9

$ sed -n '/[H]./,/[J]./!'p textdatei.txt
johann johannson  0885465468798746
Klaus Schraube  08755466584
Gabi Gans Meier   0548/9988776655
$ sed -n '/[H]./,/[j]./!'p textdatei.txt
johann johannson  0885465468798746
Klaus Schraube  08755466584

Listing 10

$ cat textdatei.txt | sed -n '/[:alnum:]/'p
johann johannson  0885465468798746
Klaus Schraube  08755466584
Hans Michael  0987654321
Jochen Hansen  0405458765143321
Gabi Gans Meier   0548/9988776655

Soll Sed in einem Rutsch mehr als nur einen Filter anwenden, hängen Sie die unterschiedlichen Aufrufe am einfachsten mit einer Pipe hintereinander (Listing 11). Das Kommando unterdrückt entsprechend Listing 10 leere Zeilen und filtert anschließend wie in Listing 7 alle Zeilen mit "Gans" aus der Ausgabe.

Listing 11

$ cat textdatei.txt | sed -n '/[:alnum:]/'p | sed -n '/Gans/!'p
johann johannson  0885465468798746
Klaus Schraube  08755466584
Hans Michael  0987654321
Jochen Hansen  0405458765143321

Ersetzen und Löschen

Für das Ersetzen von Zeichenketten in den gefundenen Ausdrücken verwenden Sie die Anweisung s. Die Länge der Zeichenketten für das Suchen und Ersetzen ist dabei unerheblich. Die Syntax der Suchen-und-Ersetzen-Anweisung lautet folgendermaßen:

$ sed -n '[Zeile(n)]s/[Muster]/Ersatz/[Optionen_für_s]'
$ sed -n '[/Muster/]s/[Muster]/Ersatz/[Optionen_für_s]'

Der Schalter -n sorgt dafür, dass Sed nur bearbeitete Zeilen ausgibt; das Muster ist optional, wenn Befehl nur auf bestimmte Zeilen angewendet werden soll. Die Tabelle "Optionen für s" führt die entsprechenden Optionen auf.

Optionen für <c>s<c>

Option Beschreibung
g Befehl auf alle gefundenen Textstellen in der Zeile anwenden
p Ergebnis der Aktionen ausgeben
w[Datei] Ergebnis in eine Datei schreiben

Die Suchen-und-Ersetzen-Anweisung beschränken Sie auf bestimmte Zeilennummern, indem Sie vor dem Kommando den Bereich in der Form 5s/Alt/Neu/p (Listing 12, Zeile 1) für eine einzelne Zeile oder in Form von 1,4/Alt/Neu/p (Zeile 2) einen Bereich angeben. Mit einem Ausrufezeichen kehren Sie die Auswahl um (Zeile 3). Weiterhin lässt sich die Anweisung unabhängig von der Suchen- beziehungsweise Ersetzen-Vorschrift auf Zeilen beschränken, die eine bestimmte Zeichenkette oder Struktur aufweisen (Zeile 4). Möchten Sie die gesuchte Zeichenkette gleich löschen, dann geben Sie Sed eine leere Ersetzungsanweisung mit.

Listing 12

$ sed -n '5s/Alt/Neu/p' [Datei]
$ sed -n '1,4/Alt/Neu/p' [Datei]
$ sed -n '20-80!s/Alt/Neu/p' [Datei]
$ sed -n '/[Zeichenkette|Muster]/s/Alt/Neu/gp' [Datei]

Grundsätzlich bearbeitet Sed jeweils das erste Auftreten des Suchmusters in einer Zeile. Soll der Editor jedoch an alle passenden Fundstellen Hand anlegen, fügen Sie am Ende der Anweisung die Option g (wie "gesamt") hinzu. Im Normalfall gibt Sed Feedback zu den jeweiligen Arbeitsschritten aus. Diese Ausgabe unterdrücken Sie mit der Option -n und verwandeln den Stream-Editor so in einen stummen Diener. Gesprächiger wird Sed hingegen mit der Option p wie ("print"). Alternativ schreiben Sie die Ergebnisse in eine neue Ausgabedatei. Zusammen mit der Option w geben Sie eine Zieldatei an. Die Tabelle "Beispiele: Suchen und Ersetzen" zeigt einige kürzere Beispiele.

Beispiele: Suchen und Ersetzen

Aktion Beispiel Listing
Suchmuster nur beim ersten Auftreten ersetzen cat textdatei.txt | sed -n 's/j/J/p' 13
Suchmuster bei jedem Auftreten ersetzen cat textdatei.txt | sed -n 's/j/J/gp' 13
Löschen des Wortes "Gans" sed -n 's/Gans//gp' textdatei.txt 14
Ersetzen von "Hans" durch "Jens" in der Zeile 4 cat textdatei.txt | sed -n '4s/Hans/Jens/gp' 15
Ersetzen von "09" durch "089" bei allen Zeilen mit der Zeichenkette "ans" sed -n '/ans/s/09/089/gp' textdatei.txt 16
Ersetzen von "0" durch "089" bei allen Zeilen, außer sie enthalten die Zeichenkette "ans" sed -n '/ans/!s/0/089/gp' textdatei.txt 17
Löschen aller Zahlen mitsamt Schrägstrichen cat textdatei.txt | sed -n s'/[0-9\/]//'gp 18

Listing 13

$ cat textdatei.txt | sed -n 's/j/J/p'
Johann johannson  0885465468798746
$ cat textdatei.txt | sed -n 's/j/J/gp'
Johann Johannson  0885465468798746

Listing 14

$ sed -n 's/Gans//gp' textdatei.txt
Gabi  Meier   0548/9988776655

Listing 15

$ cat textdatei.txt | sed -n '4s/Hans/Jens/gp'
Jens Michael  0987654321

Listing 16

$ sed -n '/ans/s/09/089/gp' textdatei.txt
Hans Michael  08987654321

Listing 17

$ sed -n '/ans/!s/0/089/gp' textdatei.txt
johann johannson  089885465468798746
Klaus Schraube  0898755466584

Listing 18

$ cat textdatei.txt | sed -n s'/[0-9\/]//'gp
johann johannson
Klaus Schraube
Hans Michael
Jochen Hansen
Gabi Gans Meier

Ein komplexeres Beispiel finden Sie in Listing 19. Die über mehrere Zeilen per Pipe verknüpften Sed-Aufrufe bringen die uneinheitlich geschriebenen Datumsangaben aus der Datei testliste.txt in eine normierte Form. Beim Eingeben eines solchen Kettenbefehls müssen Sie darauf achten, nach dem Rückstrich \ am Ende die Zeile sofort umzubrechen und nicht noch ein Leerzeichen anzuhängen. Alternativ lassen Sie den Zeilenumbruch weg und fahren umgehend mit dem Pipe-Zeichen der Folgezeile fort.

Listing 19

$ cat testliste.txt \| sed '/^[\ ]/'s'/\ /0/'p \| sed s'/-/ /'pg \| sed s'/März/03./'p \| sed s'/April/04./'p \| sed s'/^\([0-3][0-9]\ \)/&./'p \| sed s'/\ //'gp \| uniq
22.04.1984
07.04.1985
30.03.1986
[...]

Der Aufruf von cat in Zeile 1 liest die Liste aus der Datei aus und füttert sie am am Anfang von Zeile 2 in die Pipe. Das erste Sed-Kommando in Zeile 2 ersetzt führende Leerzeichen durch die Ziffer "0". Zeile 3 tauscht Minuszeichen in den Datumsangaben gegen Leerzeichen. Die Aufrufe von Sed in den Zeilen 4 und 5 ersetzen nun den in Worten geschriebenen Monat durch den passenden numerischen Wert und hängen einen Punkt an – für ein vollständiges Kalender-Skript müssten Sie dies für jeden Kalendermonat erledigen.

Die Anweisung in Zeile 6 ist nun nicht mehr ganz so einfach zu durchblicken. Sie ersetzt alle am Zeilenanfang stehenden (^), zweistelligen Zahlen (die erste Stelle mit Ziffern von 0 bis 3, die zweite Stelle mit allen Ziffern) und einem Leerzeichen durch sich selbst (&) und einen Punkt. Damit die Wiederholung des Suchbegriffs für das Ersetzen funktioniert, setzen Sie den Bereich in runde Klammern, die Sie allerdings mit einem Backslash \ entwerten müssen.

Die Sed-Anweisung der Zeile 7 entfernt nun sämtliche Leerzeichen (g als Option von s) aus dem restlichen Text. Mit uniq aus Zeile 8 entfernen Sie am Ende noch jede mehrfach aufeinander folgende, zum Vorgänger identische Zeile, sodass Sie nun eine sauber normierte und formatierte Liste mit Datumsangaben erhalten.

Das Übernehmen des zu ersetzenden Musters in den Ersatzbegriff erspart in der Praxis viel Arbeit, daher macht ein etwas ausführlicherer Blick auf diese Funktion Sinn. Das Sed-Kommando aus der ersten Zeile von Listing 20 macht aus "schraube" das Wort "abschrauben". Ähnlich funktioniert das Umwandeln von Klein- in Großbuchstaben (Zeile 3). Das \U vor & signalisiert die Anweisung für die Ausgabe in Großbuchstaben. Für den umgekehrten Weg verwenden Sie zum Suchen [[:upper:]] und die Anweisung \L. Beide Beispiele kombiniert ergeben dann aus dem orthografisch korrekten Hauptwort "Schraube" das Verb "abschrauben" (Zeile 9).

Listing 20

$ echo "schraube" | sed -n s'/schraube/ab&n/'p
abschrauben
$ cat textdatei.txt | sed -n s'/\([[:lower:]]\)/\U&/'pg
JOHANN JOHANNSON  0885465468798746
KLAUS SCHRAUBE  08755466584
HANS MICHAEL  0987654321
JOCHEN HANSEN  0405458765143321
GABI GANS MEIER   0548/9988776655
$ echo "Schraube" | sed -n s'/Schraube/ab&n/'p | sed -n s'/\([[:upper:]]\)/\L&/'pg
abschrauben

Für Zeichenfilter und andere Anwendungen verwenden Sie diese Option y. Führen Sie in diesem Fall im Suchmuster-Teil alle Zeichen einzeln auf, die Sed austauschen soll. Der Ersetzen-Teil sollte aus der selben Anzahl an Zeichen bestehen. Der Kommandoaufbau kennt keine weiteren Optionen, auch sollten Sie -n weglassen. Das einfache Beispiel sed y'/a/b/' würde etwa sämtliche "a" im Text gegen "b" tauschen.

Listing 21 wendet die Option in einem etwas komplexeren Beispiel auf textdatei.txt an. Das Kommando ersetzt in allen Zeilen, die mit "j" beginnen, kleine "j" durch den Großbuchstaben. Dabei gilt es aber darauf zu achten, dass Sed in diesem Fall den Buchstaben auch innerhalb eines Wortes in einen Großbuchstaben verwandeln würde.

Listing 21

$ cat textdatei.txt | sed '/^j/'y'/j/J/'
Johann Johannson  0885465468798746
Klaus Schraube  08755466584
Hans Michael  0987654321
Jochen Hansen  0405458765143321
Gabi Gans Meier   0548/9988776655

Diesen Artikel als PDF kaufen

Express-Kauf als PDF

Umfang: 8 Heftseiten

Preis € 0,99
(inkl. 19% MwSt.)

LinuxCommunity kaufen

Einzelne Ausgabe
 
Abonnements
 
TABLET & SMARTPHONE APPS
Bald erhältlich
Get it on Google Play

Deutschland

Ähnliche Artikel

  • Die Kraft der Muschel
    Microsofts neue PowerShell greift auf die Bibliotheken des .NET-Frameworks zurück und verfügt so über einen riesiger Fundus von Funktionen und Objekten. Ist sie dadurch einer traditionellen Shell wie der Bash überlegen?
  • Mit Bordmitteln riesige Textdatei durchsuchen
  • Handarbeit
    Die meisten Nutzer drucken Dokumente aus einer Anwendung mit grafischer Oberfläche heraus. In einigen Situationen erweist es sich aber als sinnvoller, den Printserver Cups per Kommandozeile zu bedienen.
  • Hardcore Linux
    Dieser Teil der Serie über die Bash stellt die Grundlagen für die Arbeit mit mehreren und verketteten Befehlen auf der Bash zusammen.
  • Sauber verzahnt
    Verbinden, trennen, umformatieren: Unter Linux gibt es zahlreiche kleine Helfer, die die Arbeit mit Textdateien perfekt beherrschen – und die dazu noch perfekt zusammenarbeiten.
Kommentare

Infos zur Publikation

LU 12/2017: Perfekte Videos

Digitale Ausgabe: Preis € 5,95
(inkl. 19% MwSt.)

LinuxUser erscheint monatlich und kostet 5,95 Euro (mit DVD 8,50 Euro). Weitere Infos zum Heft finden Sie auf der Homepage.

Das Jahresabo kostet ab 86,70 Euro. Details dazu finden Sie im Computec-Shop. Im Probeabo erhalten Sie zudem drei Ausgaben zum reduzierten Preis.

Bei Google Play finden Sie digitale Ausgaben für Tablet & Smartphone.

HINWEIS ZU PAYPAL: Die Zahlung ist ohne eigenes Paypal-Konto ganz einfach per Kreditkarte oder Lastschrift möglich!

Stellenmarkt

Aktuelle Fragen

Broadcom Adapter 802.11n nachinstallieren
Thomas Mengel, 31.10.2017 20:06, 2 Antworten
Hallo, kann man nachträglich auf einer Liveversion, MX Linux auf einem USB-Stick, nachträglich...
RUN fsck Manually / Stromausfall
Arno Krug, 29.10.2017 12:51, 1 Antworten
Hallo, nach Absturz des Rechners aufgrund fehlendem Stroms startet Linux nicht mehr wie gewohn...
source.list öffnet sich nicht
sebastian reimann, 27.10.2017 09:32, 2 Antworten
hallo Zusammen Ich habe das problem Das ich meine source.list nicht öffnen kann weiß vlt jemman...
Lieber Linux oder Windows- Betriebssystem?
Sina Kaul, 13.10.2017 16:17, 6 Antworten
Hallo, bis jetzt hatte ich immer nur mit
IT-Kurse
Alice Trader, 26.09.2017 11:35, 2 Antworten
Hallo liebe Community, ich brauche Hilfe und bin sehr verzweifelt. Ih bin noch sehr neu in eure...