* Christian Salzer wrote on Tue, Nov 20, 2007 at 21:09 +0100:
Da war wieder mein Problem mit diesen verdammten regex, die ich schon vor einiger Zeit mal unters Kopfkissen legen wollte...
BTW, | ist immer langsam wegen fork()/exec(). So eine bash kann selbst aber schon verdammt viel: steffen@link:~> for ((i=0; i<10; i++)) ; do echo -n $i ; done ; echo 0123456789 (zählen) steffen@link:~> echo $((2*3)) 6 (rechnen) steffen@link:~> echo $[1 > 2] aber $[1 < 2] 0 aber 1 (auswerten) steffen@link:~> p="123456790" steffen@link:~> echo $p 123456790 (für die Beispiele) steffen@link:~> echo ${p:1:3} 234 steffen@link:~> echo ${p:5:2} 67 (substring kann ein cut sparen) steffen@link:~> echo ${p/2??5/abcd} 1abcd6790 (replace, kann neben ? auch * und mehr :) - recht mächtig) steffen@link:~> echo ${p/2[23][234]5*7/ $((100*5)) } 1 500 90 (replace mit rechnen usw geht natürlich auch. Wieso kommt 9 nach 7?!) steffen@link:~> echo ${#p} 9 (ups, da fehlt ja die 8) steffen@link:~> p="1234567890" steffen@link:~> echo ${#p} 10 (:-) Jetzt sinds 10 Zeichen.) steffen@link:~> echo ${p#*3} 4567890 (cut bis einschliesslich Zeichen 3) steffen@link:~> echo ${p%3*} 12 (cut ab einschliesslich Zeichen 3) Das beides sieht vielleicht komisch aus, ist aber nützlich, kann z.B. ein basename oder dirname sparen: steffen@link:~> p="/usr/bin/perl" steffen@link:~> echo ${p##*/} perl ("${path##*/}" kann man sich merken, finde ich, kann man öfter mal brauchen, ist aber leider wenig intuitiv, finde ich.) So kriegt man auch Wort-weises cutten hin (mit "* " und so): steffen@link:~> echo \"$p\" "ein paar worte als string" steffen@link:~> echo \"${p#* * }\" "worte als string" ("* * " matcht auf "ein paar " minimal und cuttet das weg) Das geht mit Arrays natürlich einfacher: steffen@link:~> declare -a arr (ein array "arr", wäre /hier/ gar nicht notwendig) steffen@link:~> arr=($p) (macht word-splitting) teffen@link:~> echo ${arr[2]} - ${arr[1]} - ${arr[0]} worte - paar - ein (bei sowas muss ich öfter mal nachgucken und probieren, hilft aber oft ganz nett) Das ist auch schreibbar: steffen@link:~> arr[0]=zwei ; arr[1]="Paar" steffen@link:~> echo ${arr[@]} zwei Paar worte als string (Array `wortweise' verwenden) steffen@link:~> unset arr[1+1-1] (kann auch Rechnen etc) steffen@link:~> echo ${arr[*]} zwei worte als string (Array als ein Wort verwenden; nicht zu verwechseln mit echo ${arr[@]}, was /hier/ gleich aussieht) Ich hab mal ein paar Beispiele aufgeschrieben, weil ich früher die bash manpage schwer verständlich fand (gut, ich find sie immer noch schwer verständlich) und das früher alles gar nicht kannte / genutzt hatte. Vielleicht hilft jemandem das eine oder andere ja mal. bash kann auch Funktionen und Blöcke pipen etc: steffen@link:~> p=$( echo hallo ) ; q=H${p:1:3}O ; echo $p - $q hallo - HallO (weiss jemand, ob das wirklich ohne fork() gemacht wird? müsste eigentlich, oder?) steffen@link:~> echo $( echo "start in $(pwd)"; ( cd /tmp && pwd ); echo "back in $(pwd)" ) start in /home/steffen /tmp back in /home/steffen na ja usw. oki, Steffen -- Dieses Schreiben wurde maschinell erstellt, es trägt daher weder Unterschrift noch Siegel. -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org