Hi Al, Am Dienstag, 19. April 2011 23:44:31 schrieb Al Bogner:
Gegeben ist eine liste, die durch , getrennt ist, also zB
var="dfsdf, as sdfd, sd fdsf dsf, sdfs?? d, ??, a?b, dfas" (in der Variable könnten auch " oder ' vorkommen, es sind alle Zeichen aus Latin1 möglich)
Nun sollen alle Felder, d.h. zwischen den Kommata entfernt werden, die ? Zeichen erhalten.
Im Beispiel wäre das Ergebnis also: dfsdf, as sdfd, sd fdsf dsf, dfas
Was wäre eine bessere Lösung als:
echo "$var" | tr ',' '\n' | grep -v "?" | tr '\n' ',' | sed 's/,*$//' dfsdf, as sdfd, sd fdsf dsf, dfas
evtl. awk, du müsstest dann in einer Schleife durch die Felder iterieren und schauen ob ein ? drin ist. echo "dfsdf, as sdfd, sd fdsf dsf, sdfs?? d, ??, a?b, dfas" | awk 'BEGIN{FS=","}{sum=0;for (i=1;i<=NF;i++)if(index($i,"?")==0)printf $i","}' oder nach printf lehrbuch echo "dfsdf, as sdfd, sd fdsf dsf, sdfs?? d, ??, a?b, dfas" | awk 'BEGIN{FS=","}{sum=0;for (i=1;i<=NF;i++)if(index($i,"?")==0)printf "%s,",$i}' falls du einen evtl. zeilenumbruch wieder brauchst solltest du nach der schleife noch ein print einfügen. echo "dfsdf, as sdfd, sd fdsf dsf, sdfs?? d, ??, a?b, dfas" | awk 'BEGIN{FS=","}{sum=0;for (i=1;i<=NF;i++)if(index($i,"?")==0)printf "%s,",$i; print}' untested! jeweils alles in einer Zeile Sowohl akw als auch sed sind nicht die schnelltsen, man sollte bei solch kleinen Aufgaben immer beide testen, je nach Aufgabe kann man da die eine oder andere Überraschung erleben. -- Gruss Falk -- 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