Hallo, Am Mon, 04 Mai 2009, Al Bogner schrieb:
Am Sonntag 03 Mai 2009 22:23:44 schrieb David Haller:
Seit Jahren hoffe ich, dass man mit tr '[:upper:]' '[:lower:]' auch utf-8- Zeichen nach klein wandeln kann. Da tut sich aber nichts. Mit meinem Workaround [..]
Am Son, 03 Mai 2009, Al Bogner schrieb: perl -wpe 'BEGIN { use Encode; binmode(STDIN, ":utf8"); # oder binmode(STDIN, ":encoding(utf8)"); binmode(STDOUT, ":utf8"); # oder binmode(STDOUT, ":encoding(utf8)"); } s/.*/\L$&/g;' < EINGABEDATEI > AUSGABEDATEI
Das ":encoding(utf8)" prÃŒft dabei die Kodierung.
Funktioniert hier mit Griechisch unter openSUSE-11.1 / perl-5.10 / Encode-2.23 sowie unter SuSE-6.2 / perl-5.8.6 / Encode-2.33.
Ist zwar ein bisschen schrÀg, aber wie integriere ich das am besten in ein (gröÃeres ansonsten gut funktionierendes) bash-Skript?
Generell ist das portieren von bash nach perl recht einfach -- wenn das bash-script nicht zu konfus ist und man nicht mehr kapiert, was man da eigentlich warum macht ;)
Irgendwann kommt der Text als Variable, zum Testen zB
var="??ndim Havuz Ba????na (???? ???? ???????????? ???? ??????????)"
Am besten, du filterst gleich wenn du die Variable belegst bzw. die Daten holst, ggfs. per if eingeschrÀnkt auf bestimmte Zeilen oder so und als Funktion verpackt. sanitize_utf8() { perl -wpe '...' } var"$(befehl ... | sanitize_utf8)" # statt var="$(befehl ...)" oder so. Ansonsten ganz klassisch per echo + pipe: var="$(echo "$eingabe" | sanitize_utf8)" wobei $eingabe = $var sein darf (s.u.) ;)
Bei der Gelegenheit wÀre es auch gleich gut, eventuelle nicht druckbare Zeichen rauszuwerfen, die sich manchmal in den Text verirren (der von irgendwo herkommt)
==== #!/bin/bash sanitize_utf8() { perl -wpe 'BEGIN { use Encode; binmode(STDIN, ":encoding(utf8)"); binmode(STDOUT, ":encoding(utf8)"); } s/[^[:print:]]//g; # undruckbares lï¿œschen s/.*/\L$&/g if /Muster1|Muster2/; # nur wenn Muster1 oder Muster2 # in der Zeile vorkommt # erster Buchstabe eines Wortes groï¿œ, Rest klein: # s/\b(\w+)\b/\u\L$1\E/g; # weiï¿œ jetzt nicht, wie das \w auf # z.B. griechisch passt, aber mit # deinem Beispiel klappts (aus "ta" # wird "Ta") ... ' } var="Ä°ndim Havuz BaÅına (΀ι Ïα ΞÎÎ»ÎµÎ¹Ï Ïα λεÏÏά)" echo "$var" var="$(echo "$var" | sanitize_utf8)" echo "$var" ==== Im uxterm auf der 11.1 sieht's perfekt aus :) Und wenn ich das \u Escape im letzten (auskommentierten) s/// rausnehm wird auch das à zu Ã. HTH, -dnh -- The only languages that can comfortably be written with the repertoire of US-ASCII happen to be Latin, Swahili, Hawaiian and American English without most typographic frills. It is rumoured that there are more languages in the world. -- Roman Czyborra -- 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