Hallo, On Sun, 29 Jun 2003, Adalbert Michelic schrieb:
* On Sun, 29 Jun 2003 at 1:44 +0200, Jan Trippler wrote: [...]
SHELLPROMPT$ for f in /dir/file dir/file /file file; do echo "$f" | sed '/^\/[^/]*$/{s#.*#/#;b;};/\//{s#/[^/]*$##;b;};/^[^/]*$/{s#.*#.#;}'; done /dir dir /
^ hier hast Du 'nen Punkt unterschlagen *grummel*
Wenn da ein Punkt hingehört - David hat in einer zweiten schon gesagt, daß die erste unvollständig ist; er schickts nochmal - die zweite war genauso unvollständig - kann es sein, daß da irgendeine der beteiligten Komponenten Hickups bekommen hat, und den Punkt für das Ende der Mail hielt?
Offenbar. Seufz. Also dritter Versuch (mit entschaerften '^.$'. ==== Ja. *GRINS* SHELLPROMPT$ for f in /dir/file dir/file /file file; do echo "$f" | sed '/^\/[^/]*$/{s#.*#/#;b;};/\//{s#/[^/]*$##;b;};/^[^/]*$/{s#.*#.#;}'; done /dir dir / . SHELLPROMPT$ Oder nochmal uebersichtlicher geschrieben: sed ' /^\/[^/]*$/ { s#.*#/#; b; }; /\// { s#/[^/]*$##; b; }; /^[^/]*$/ { s#.*#.#; }'
[...]
echo "$file" | awk -F'/' '{for(i=1;i
Diese Variante hat das gleiche Problem wie Dein sed oben - sie liefert ein falsches Ergebnis, wenn es keinen / in $file gibt.
Daran kranken uebrigens auch die "${}" shell-Konstrukte...
echo "$file" | awk -F/ '{print substr($0,length($0)-length($NF)-1);}'
wäre eine Alternative.
Nicht wirklich... $ for f in /dir/file dir/file /file file; do echo "$f" | awk -F/ '{print substr($0,length($0)-length($NF)-1);}'; done r/file r/file /file file Das entspricht also eher basename und da ist "print $NF" praktischer (das uebrigens fuer alle 4 Faelle funktioniert ;) Du wolltest vermutlich print substr($0, 0, length($0)-length($NF)-1); ^^!! verwenden, richtig? Man muesste die gleiche Fallunterscheidung wie ich oben beim sed machen, was aber kein Problem ist. awk -F'/' ' /^\/[^/]*$/ { print "/"; next; } /\// { print gensub("\/[^/]*$","",""); next; } /^[^/]*$/ { print "."; }' An der Stelle des 'print gensub ...' kann man auch eine der anderen Varianten von "dirname" in awk, die schon genannt wurden verwenden. Aber, wie Bernd schon gesagt hat, sollte man moeglichst dirname/basename verwenden.
[...]
PS: ja, die AWK-Befehle sind unschoen "komprimiert"...
ACK *duck_und_weg*
*g* -dnh ==== -- Ah. Feeding pills to cats. I believe that I am the true master of feline-pill-administering. -- Lionel im the SDM