Das UNIX-Kommando sed ("stream editor") ist ein Filter und dient dazu, einfache Editieroperationen auf Datenströmen auszuführen. Auf GNU Systemen wird logischerweise GNU sed verwendet, das gegenüber dem originalen Unix sed einige Erweiterungen erfahren hat.
Beispiel:
sed 's/falsch/richtig/g' < falsch.txt > richtig.txt
ersetzt "falsch" durch "richtig" im Text
sed -n 's/MemTotal: \+\([0-9]\+\) kB/\1/p' </proc/meminfo
bestimmt die Gesamtspeicher-Menge des Kernels (2.5) in kB.
sed '/pattern/p;d'
kann wie grep verwendet werden.
echo 'such die nadel im heuhaufen' | sed -n 's/.*\(nadel.*haufen\).*/\1/p'
Gibt nur die Treffer aus anstatt der kompletten Zeile
Tipps
Für Konvertierung von Zeichensätzen, Umlauten und Zeilenenden ist recode besser geeignet.
Probleme, die dazu neigen, komplizierter zu werden (die also über eine einfache Ersetzung hinausgehen) verlangen irgendwann nach einem leistungsfähigeren Tool als sed. Genau aus diesem Grund wurde seinerzeit Perl entwickelt. Die RegularExpressions-Syntax ist mächtiger und insbesondere gibt es die Kommandozeilenoptionen -p, -n, -i und -e, die man sich ansehen sollte. So kann man obiges Beispiel auch als
perl -pe 's/falsch/richtig/g' falsch.txt > richtig.txt
schreiben. Wer also tiefer in die sed-Magie einsteigen will, sollte besser gleich zu ["Perl"] greifen. -- ThomasBayen
Frage: Wie kann ich aus einer Datei mit mehreren Webadressen nur die Adressen (zwischen href=" und ") herausfiltern?
Hmm.. das wuerd ich mit Perl machen:
perl -nle 'print $1 while(/href="([^"]*)"/ig)' < adressen.html
Und das gleiche nochmal für E-Mailadressen, weil ichs grad gebraucht hab. Die E-Mailadressen sind in Anführungszeichen eingeschlossen:
perl -nle 'print $1 while(/.*\"([A-Za-z.]+@[A-Za-z.]+)\".*/ig)' * 2> /dev/null > mailadressen.txt