Hallo, Am Sat, 27 Aug 2005, Al Bogner schrieb:
Am Samstag, 27. August 2005 02:17 schrieb David Haller:
$ var="Diese_Worte_sollten_sortiert_ werden_xy_yz_xy" $ varsortiert="`echo \"$var\" | tr '_' '\n' | \ sed -e 's/ //g;${/^\(xy\|yz\)$/d; };' | sort -f | xargs echo`"
Beachte ausserdem _BITTE_ generell das Quoting, insbes. das foo="`echo \"$var\" | machwas`"
Ja. ja. das Quoting ist hier ganz wichtig. Ich hatte einfach echo $var verwendet und das klappte auch, während es mit "$var" nicht passte.
Ich verstehe noch nicht so recht, warum du in diesem Fall \"$var\" verwendest. Einfach aus Vorsicht?
Nein. Hm. Ich kann aber gerade nicht nachvollziehen, warum die inneren Doublequotes escaped werden (muessen?)... Gequoted werden muss aber. Ich habe das mit Jan Trippler mal auseinanderklamusert: foo=`echo $var | bar` ## faellt sehr oft auf die Schnauze, z.B. wenn ## $var mit '-e' beginnt und escape-Sequenzen ## enthaelt. Und Wildcards werden expandiert. foo=`echo "$var" | bar` ## faellt in seltenen Sonderfaellen, dann aber ## sehr gemein auf die Fresse (Sonderzeichen ## in der Ausgabe von bar foo="`echo $var | bar`" ## faellt haeufig, siehe erster Fall foo="`echo \"$var\" | bar`" ## faellt IIRC nur bei " in $var und ist ## noch die beste Loesung.
Außerdem suche ich noch nach einer Lösung um Wortgruppen, wie zB "Gran Canaria" zusammenzuhalten. Mein Workaround ist als Trenner _ zu verwenden und Worte, die zusammengehören mit . zu trennen. Also zB so: "Gran.Canaria_sollte_nicht_getrennt_werden"
Jup, wenn Du musst irgendwie die Gruppen "erstellen", sei es durch ein anderes Trennzeichen oder durch quoten. Der Punkt ist nicht ideal, weil der einerseits zu haeufig (und in z.B. in ~/.kde/) vorkommt und andererseits eben eine Bedeutung in REs hat. Nimm z.B. das Macron '¯'. Oder das Leerzeichen ;) Oder haben die Ausgangsdaten Leerzeichen, die du vor der Bearbeitung durch "_" ersetzt? Und wie soll das Ergebnis aussehen? Ich hab' hier z.B. das: dh@slarty[3]: ~ (0)$ echo "var='$var'"; \ echo "$var" | tr '_' '\n' | sed -e '${/^\(xy\|yz\)$/d;};s/¯/ /g' \ | sort -f | while read x; do echo -n "'$x' "; done \ | sed 's/ $/\ /' var='Gran Canaria_sollte_nicht_getrennt_werden' 'getrennt' 'Gran Canaria' 'nicht' 'sollte' 'werden' (mit der While-Schleife ist die Ausgabe huebscher, wenn du die '' ums $x weglaesst ;) Wenn du noch etwas mehr anstellst ist perl bald sehr interessant, da ist alles etwas einfacher: dh@slarty[3]: ~ (0)$ echo "var='$var'"; dh@slarty[3]: ~ (0)$ echo "$var" | perl -ne ' @_ = split(/_/); pop @_ if $_[$#_-1] =~ /^xy|yz/; print "\"", join("\" \"", sort { uc($a) cmp uc($b) } @_), "\"\n";' var='Gran Canaria_sollte_nicht_awooga!_getrennt_werden_yz_xy_yz' "awooga!" "getrennt" "Gran Canaria" "nicht" "sollte" "werden" "xy" "yz" (Lass dich von den \"\" nicht irritieren, die sind hier eher zum debuggen und wg. dem quoten aus der shell da, in einem script geht das wesentlich uebersichtlicher.) Das Perl kann man natuerlich mit gescheiten laengeren Variablennamen schreiben v.a. missbrauche ich auch '@_'. Und die Ausgabe kannst du beim "join" ja beliebig anpassen. BTW: wo kommen die Eingabedaten her? Aus ner Datei? Die koenntest du dann auch gleich in perl lesen und verwursten... Oder per Pipe aus ls oder find? Dann hilft File::Find mit einer grossen Flexibilitaet. Jedenfalls: du muesstest das meiste direkt in perl machen koennen, ohne externe Prozessse zu starten, das sollte dann die vergleichsweise lange Startzeit von perl ausgleichen. Erzaehl also noch ein bisserl mehr ;) -dnh -- "Man kann sich auch die Brille an die Nase nageln. Alleskleber erpsart das lästige kämmen am Morgen." [Woko° in dag°]