manes hat geschrieben:Meillo hat geschrieben:Ja, ich weiß, die meine ich auch.
manchmal fühle ich mich hier wie beim monopoly, wenn alle an einem vorbeiziehen und ich ohne 4000 mark zurück auf start muß.
Nur nicht verzweifeln.
hat jemand mal ein sed-tutorial for beginners zur hand? ich finde im netz nur anleitungen, die ähem nicht meinem niveau entsprechen...
Das betrifft nicht sed, sondern die Shell.
Du sagst der Shell
Die Shell sieht darin einen Befehl <alias> (dass das ein Builtin ist ist egal), und ein Argument <foo='echo abcdef | sed -r 's/.\{3\}$//''>. (Ich verwende die spitzen Klammern hier um die Codezeile zu begrenzen.)
Die Shell ruft also alias auf mit dem einen Argument. (Ob das wirklich genau so läuft weiß ich nicht, sollte aber irrelevant sein.) Das Argument wird aber zuvor von der Shell bearbeitet (d.h. Variablenexpansion, Historyexpansion, etc).
Der Reihe nach:
<foo=> ist uninteressant, da keines der Zeichen eine Sonderbedeutung für die Shell hat.
<'echo abcdef | sed -r '> ist ein String in Single-Quotes, somit wird er von der Shell eins zu eins übernommen. Quotes werden entfernt.
<s/.> sind Zeichen ohne Sonderbedeutung
<\{> die Escapesequenz wird ersetzt, durch die öffnende geschweifte Klammer
<3> ein normales Zeichen
<\}> die Escapesequenz wird ersetzt, durch die schließende geschweifte Klammer
<$//> es würde eine Variablenexpansion stattfinden, wenn $/ oder $// eine gültige Variable wäre. Da das nicht so ist wird's einfach übernommen.
<''> ist ein leerer String. Quotes werden entfernt.
Heraus kommt der eine String: <foo=echo abcde | sed -r s/.{3}$//>. (Dass alias den Teil nach dem Gleichheitszeichen in Single-Quotes einfasst ist eine Sache der Darstellung. Wenn du es mit Variablen testest, dann ist es wie erwartet.)
Siehst du nun, dass das sed-Kommando *nicht* in Single-Quotes eingeschlossen ist, sondern von ihnen ausgeschlossen ist?
Du denkst bislang immer an den Fall "foo'bar'baz", da ist bar eingeschlossen, in 'foo'bar'baz' aber nicht.
btw: 2000 Posts