Hallo, Am Tue, 19 Apr 2011, Al Bogner schrieb:
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
Schnellschuss (und was auch immer das '?' ist): $ echo 'dfsdf, as sdfd, sd fdsf dsf, sdfs?? d, ??, a?b, dfas' | \ awk -F',' 'BEGIN { ORS=","; } { for(i=1;i<=NF;i++) { if( $i !~ /?/ ) { print $i; }; }; printf "\n"; }' dfsdf, as sdfd, sd fdsf dsf, dfas, Oder, man bastelt sich die Zeile neu, was die Ausgabe schöner macht: $ echo 'dfsdf, as sdfd, sd fdsf dsf, sdfs?? d, ??, a?b, dfas' | \ awk -F',' 'BEGIN { OFS=","; } { for( i=1;i<=NF;i++) { if( $i ~ /\?/ ) { $i=""; }; }; print; }' dfsdf, as sdfd, sd fdsf dsf,,,, dfas oder: echo 'dfsdf, as sdfd, sd fdsf dsf, sdfs?? d, ??, a?b, dfas' | \ awk -F',' ' { for( i = 1; i <= NF; i++ ) { if( $i !~ /\?/) { l[j] = $i; j++; }; }; for(f in l) { printf("%s,", l[f]); }; printf("\n"); }' dfsdf, as sdfd, sd fdsf dsf, dfas, Oder man macht sich's einfacher: $ echo 'dfsdf, as sdfd, sd fdsf dsf, sdfs?? d, ??, a?b, dfas' | \ perl -Mstrict -w -F',' -an -e ' my @L; foreach(@F) { if(!m/\?/) { push(@L, $_); } }; print join(",", @L); ' dfsdf, as sdfd, sd fdsf dsf, dfas Funktioniert auch mehrzeilig (und mit anderen/mehreren usw. Zeichen und Strings statt dem '?'). -dnh PS: bzgl. der PM, da brauch ich noch ne Weile ... -- 149: Telefon Gerät, das die Person am anderen Ende der Leitung bescheuert macht. (Funktioniert in beide Richtungen) -- 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