Folgende Situation: Du hast einen Text bekommen, der lauter Umlaute enthaelt. Du willst aber ae oe und so weiter stattdessen haben. Mormalerweise musst Du jetzt einen Editor wie den vi oder emacs aufrufen um das fuer jeden Text immer wieder zu aendern. Es gibt aber noch einen anderen Weg. Es gibt naemlich einen Editor, der alles automatisch macht, wenn man ihm den Befehl dazu gibt: Und so geht das: Zuerst laesst man die Datei in den Editor "stroemen" mit "sed < datei". Dadurch stroemt die Datei in den (s)tream(ed)itor. Jetzt gibt man dem sed einen Befehl mit und zwar mit Hilfe von -e "s/vorher/nachher/" . Zwischen den / findet der Ersetzungsbefehl statt. (Statt / kann auch ein anderes nicht- alphanumerisches Zeichen verwendet werden. ) Nach dem ersten / steht das, was ersetzt werden soll. Nach dem zweiten / steht das, was statt dessen stehen soll. Das dritte / markiert das Ende der Ersetzung. (sed gestattet auch die Verwendung von ::: statt ///, was besonders nuetzlich ist, wenn man in dem, was ersetzt werden soll, schon dieses / hat. sed ist zwar innerhalb eines SCriptes weit toleranter, aber nicht auf der Kommandoeingabe.) sed -e "s/Alster/Elbe/" datei.geaendert. Nehmen wir einen anderen Fall. Jemand hat etwas programmiert und will jetzt alle Zeilen auskommentiere, in denen er einen Fehler vermutet, weil dort eine bestimmte Anweisung scheinbar Fehler verursacht. In einer ganzen Zeile kann viel stehen und das will man ja nicht explizit angeben muessen. Fuer einen solchen Fall hat sed die beiden Zeichen \( und \). Das so geklammerte wird naemlich nicht nur ersetzt, sondern fuer eine weitere Verarbeitung aufbewahrt. z.B sed -e "s/\(*:.*\)/#\1/" < datei kommentiert. Das sieht ziemlich krytisch aus und man muss sich schon konzentrieren, wenn man auf diese Art und Weise ersetzt. Am besten vorher eine Kopie machen. Auf jeden Fall erst auf den Bildschirm ausgeben. Wichtig ist, dass der Stern * nicht bedeutet, dass etwas einmal vorkommt. sondern null- oder einmal! (Diese raffinierte Art des Ersetzens betritt den Raum des regulaeren Ausdruckes.) Um also eine Zeile zu speichern, die ein : enthaelt, muss man davon ausgehen, dass vorher Zeichen einmal oder auch gar nicht vorkommen. Mit *: ist dieses Kriterium erfuellt. Nach dem : muss aber ein .* stehen, sonst speichert \( \) auch alles, was : null mal enthaelt. Umbedingt zu beachten! Wiederholt werden kann das Gespeicherte mit \1. Wenn mehr als eine bestimmte Stelle gespeichert werden soll, ver - wendet man einfach mehrmals die Klammern \( \) und holt sich den Inhalt mit \2 \3 usw. Hat man diese etwas kryptische Art der Ersetzung erst mal verstanden, wird man sie gerne immer anwenden, da sie viel Zeit sparen kann. Ein sehr gutes Beispiel liefert das kl. Shellscript dirtree, das ich hier einmal erklaere: dirtree macht nichts anderes als die Ausgabe von find -type d -print graphisch schoener aufzubereiten. (Es lohnt sich, sich erst mal die Normalausgabe anzuschauen.) #!/bin/sh if [ $# -eq 0 ] then ARG=`pwd` else ARG=$@ fi erst einmal wird hier ein Check durchgefuehrt. Immer, wenn dirtree ohne Parameter aufgerufen wird, ( $# -eq 0) dann soll als Parameter das Ergebnis der shell-internen Funktion pwd aufgerufen werden, die dann genau angibt, fuer welchen Ordner alle Dateien aufgelistet werden sollen. Ansonsten werden die vorher genannten Parameter benutzt. ($@) find $ARG -type d -print 2>/dev/null|sort|sed -e ': Hiermit wird das Programm find aufgerufen, das jetzt einen Ordner (-type d) sucht, dessen Inhalt ausgibt, die Fehlerausgabe der Suche wegschmeisst (2>/dev/null), alphabetisch sortiert (|sort) und dann sed mit folgenden Befehlen aufruft: s/[^\/]*\//|-----/g Hier findet die Ersetzung statt. Hier tritt eine Beschreibungssprache auf, die man auf englisch regular expression nennt. [^\/] heisst, dass alles, was mit / beginnt (^ [Beginn], \/ schuetzt das Zeichen / davor, fuer ein Zeichen der Ersetzung von sed selber gehalten zu werden.) und dem dann 0 oder mehrere Zeichen folgen, bis wieder ein / folgt mit |----- ersetzt werden sollen. /g zeigt an, dass das mehrmals pro Zeile passieren kann. Etwas uebersichtlicher mag es sein, dieses so zu schreiben: s:[^/]*/:|-----:g, hier wurden einfach die /// mit ::: ersetzt. s/|-----|/ |/g s/ |----- / /g s/|-----|/ |/g s/ |----- / /g ' Da das reine find-Programm in einer Zeile mehrere solcher / Zeichen hat, die nun alle mit |-----| ersetzt wurden, muessen mehrere Ersetzungen stattfinden, bis das Ergebnis dem aehnelt, was man von dos her kennt. Man kann ja mal probieren, wie eine einzige Ersetzung durch s/[^\/]*\//|-----/g aussieht. Man hat hier den Eindruck eines Rasters. [Uebrigens: Wer gerne ein schoeneres Aussehen von dirtree haben will, der ersetzte einfach - durch das Sonderzeichen, das bei vielen Fonts mit alt-196 auf dem Ziffernblock zu erreichen ist. Statt dem Pipezeichen | kann man das schoenere alt-195 verwenden. Das ganze aehnelt dann fast perfekt dem tree -commando, was dos-usern bekannt ist.] (siehe mein Kommentar zu den Sonderzeichen) --- Perl statt sed ------------------------------ Eigentlich kann man auch Perl (wenn man es installiert hat) fuer ein Suchen/Ersetzen benutzen. Es ist nicht so schnell getippt. aber Perl ist viel maechtiger und bei einem langen Script schneller (wenn das eine Rolle spielt?). Auch Perl verwendet die regulaeren Ausdruecke, wie sie von sed bekannt sind: Moechte ich beispielsweise eine schoenere Liste aller Pfadeintraege haben, dann tippe ich ein: echo $PATH|perl -pne 's/:/\n\n/g' Das sieht doch schon uebersichtlicher aus. Das \n steht hier fuer NEWLINE, der Doppelpunkt wird also durch einen Zeilenvorsprung ersetzt Es gibt aber auch das Programm tr. Dieses Programm ist sehr klein und sehr schnell. An sich ist es nicht besonders sinnvoll, Perl in dem oben genannten Fall ueberhaupt einzusetzen. Mir ist nur frueher nicht die Idee gekommen, wie ich Perl vermeiden kann, da ich nicht wussste, wie sed so etwas machen kann. Perl ist sehr gross und wird doch nur fuer eine winzige Aufgabe aufgerufen. Das ist nicht sinnvoll! Das Kommando tr " " "\n" macht naemlich dasselbe und ist viel schneller. --- sed zum Ersetzen eines Leerzeichens-------- Lange habe ich geraetzelt, wie ich das machen kann. Eine Datei hat lauter Leerzeichen als Informations- trenner. Das liest sich meist sehr schlecht. Wie kann man nun automatisch und - ohne Perl zu nutzen - daraus 2 newlines machenn? Hier ist die Loesung: sed 's@ @\$\control-J@g' < datei (Die Control-J Zeichen sind im Elvis nicht darstellbar. Stattdessen springt Elvis sofort eine Zeile weiter!) Wichtig hierbei ist vor allem das \ Zeichen. Ausserdem sollte man nicht  eingeben, da dann der Text DOS-artige Wagenruecklauf-Zeichen enthaelt, die dann bei less hervorrufen. ( Dies ist aber anders als beim vim, der hierbei normale newlines einfuegt und keinen Wagenruecklauf. Nicht verwechseln!!) Das ganze ist so kryptisch, dass ich selber nur mit ganz viel Ausdauer auf die Loesung gekommen bin. Danke hierfuer an Winfried Truemper!