![](https://seccdn.libravatar.org/avatar/b6b27958072dd201c9f2bba8b6bfa337.jpg?s=120&d=mm&r=g)
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 iconv -f UTF-8 -t Zeichensatz export LC_CTYPE=Zeichensatz klappt das aber auch nur dann, wenn der andere Zeichensatz alle vorhandenen Zeichen abdeckt. Bei einem Text mit spanischen, griechischen und türkischen Worten scheitere ich, wenn ich den nach klein wandeln möchte. Irgendwelche Ideen? Al -- 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
![](https://seccdn.libravatar.org/avatar/363424a7062b0e7a90527600f3760d46.jpg?s=120&d=mm&r=g)
Hallo, Am Son, 03 Mai 2009, Al Bogner schrieb:
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
iconv -f UTF-8 -t Zeichensatz export LC_CTYPE=Zeichensatz
klappt das aber auch nur dann, wenn der andere Zeichensatz alle vorhandenen Zeichen abdeckt.
Bei einem Text mit spanischen, griechischen und türkischen Worten scheitere ich, wenn ich den nach klein wandeln möchte.
Irgendwelche Ideen?
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. HTH, -dnh -- "Any setuid root program that does an exec() somewhere is just a less user friendly version of su." -- Olaf Kirch on bugtraq 2000-08-07 -- 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
![](https://seccdn.libravatar.org/avatar/b6b27958072dd201c9f2bba8b6bfa337.jpg?s=120&d=mm&r=g)
Am Sonntag 03 Mai 2009 22:23:44 schrieb David Haller: Hallo David,
Am Son, 03 Mai 2009, Al Bogner schrieb:
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
iconv -f UTF-8 -t Zeichensatz export LC_CTYPE=Zeichensatz
klappt das aber auch nur dann, wenn der andere Zeichensatz alle vorhandenen Zeichen abdeckt.
Bei einem Text mit spanischen, griechischen und türkischen Worten scheitere ich, wenn ich den nach klein wandeln möchte.
Irgendwelche Ideen?
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? Irgendwann kommt der Text als Variable, zum Testen zB var="İndim Havuz Başına (Τι τα θέλεις τα λεφτά)" 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) Al -- 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
![](https://seccdn.libravatar.org/avatar/363424a7062b0e7a90527600f3760d46.jpg?s=120&d=mm&r=g)
Hallo, Am Mon, 04 Mai 2009, Al Bogner schrieb:
Am Sonntag 03 Mai 2009 22:23:44 schrieb David Haller:
Am Son, 03 Mai 2009, Al Bogner schrieb:
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 [..] 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
![](https://seccdn.libravatar.org/avatar/b6b27958072dd201c9f2bba8b6bfa337.jpg?s=120&d=mm&r=g)
Am Montag 04 Mai 2009 02:46:58 schrieb David Haller: Hallo David,
==== #!/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 Ã.
Bei mir klappt es nicht. Ich schick dir mein kleines Script per PM. Al -- 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
![](https://seccdn.libravatar.org/avatar/363424a7062b0e7a90527600f3760d46.jpg?s=120&d=mm&r=g)
Hallo, Am Mon, 04 Mai 2009, Al Bogner schrieb: [..]
s/.*/\L$&/g if /Muster1|Muster2/; # nur wenn Muster1 oder Muster2
[..] Bei mir klappt es nicht. Ich schick dir mein kleines Script per PM.
Was du alles als "klein" bezeichnest ... Hast du das mit den Mustern berücksichtigt? Ändere testhalber s/.*/\L$&/g if /Muster1|Muster2/; in s/.*/\L$&/g; Ansonsten: Script ist so gut wie fertig, die Transliterationen sind hier auf der ollen Kiste ohne UTF-8 etwas arg mühsam -- und es fehl(t)en eh noch welche ;) -dnh -- Die CDU sagt, die SPD hat keine Ahnung. Die SPD sagt, die CDU hat keine Ahnung. Und das beste ist: Beide haben recht. -- Mike Krüger in 7 Tage 7 Köpfe -- 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
![](https://seccdn.libravatar.org/avatar/27023f5ba9c8e122060340126d06642c.jpg?s=120&d=mm&r=g)
Hi Al! On So, 03 Mai 2009, Al Bogner wrote:
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
iconv -f UTF-8 -t Zeichensatz export LC_CTYPE=Zeichensatz
klappt das aber auch nur dann, wenn der andere Zeichensatz alle vorhandenen Zeichen abdeckt.
Bei einem Text mit spanischen, griechischen und türkischen Worten scheitere ich, wenn ich den nach klein wandeln möchte.
Irgendwelche Ideen?
Ich hätte mehrere Ideen, hab aber nichts zum Testen. awk '{print tolower($0)}' foo oder perl -ne 'print lc' foo oder python -c 'import sys; print(open(sys.argv[1]).read().lower())' foo oder sed -re 's/([[:upper:]])/\L\1/g' foo ¹ oder vim -u NONE -N -c 'exe "normal guG"|w lower.txt' foo Mit freundlichen Grüßen Christian __ ¹) Die offensichtliche Sed Lösung: sed 'y/[[:upper:]]/[[:lower:]]/' funktioniert nicht. Ich bin mir nicht sicher, ob das ein Bug oder ein Feature ist. -- hundred-and-one symptoms of being an internet addict: 217. Your sex life has drastically improved...so what if it's only cyber-sex! -- 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
![](https://seccdn.libravatar.org/avatar/b6b27958072dd201c9f2bba8b6bfa337.jpg?s=120&d=mm&r=g)
Am Montag 04 Mai 2009 08:41:55 schrieb Christian Brabandt:
On So, 03 Mai 2009, Al Bogner wrote:
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
iconv -f UTF-8 -t Zeichensatz export LC_CTYPE=Zeichensatz
klappt das aber auch nur dann, wenn der andere Zeichensatz alle vorhandenen Zeichen abdeckt.
Bei einem Text mit spanischen, griechischen und türkischen Worten scheitere ich, wenn ich den nach klein wandeln möchte.
Irgendwelche Ideen?
Ich hätte mehrere Ideen, hab aber nichts zum Testen.
Hallo Christian, hier hast du einen Test, der als Variable im Bash-Skript vorliegt. Ergebnis soll wieder eine Variable sein. Ganz unproblematisch ist es aber nicht, da ich immer wieder isländische Zeichen in einem türkischen Text entdecke. Vgl. http://de.wikipedia.org/wiki/ISO_8859-9 "ISO 8859-9 versucht alle Sonderzeichen der türkischen Sprache abzudecken. Sein Vorgänger ist ISO 8859-3 bzw. ISO 8859-1, wobei die türkischen (Ğ/ğ, İ/ı, Ş/ş) die isländischen (Đ/ð, Ý/ý, Þ/þ) Sonderzeichen ersetzen." "İndim Havuz Başına (Τι τα θέλεις τα λεφτά)" Al -- 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
![](https://seccdn.libravatar.org/avatar/27023f5ba9c8e122060340126d06642c.jpg?s=120&d=mm&r=g)
Hi Al! On Mo, 04 Mai 2009, Al Bogner wrote:
"ISO 8859-9 versucht alle Sonderzeichen der türkischen Sprache abzudecken. Sein Vorgänger ist ISO 8859-3 bzw. ISO 8859-1, wobei die türkischen (Ğ/ğ, İ/ı, Ş/ş) die isländischen (Đ/ð, Ý/ý, Þ/þ) Sonderzeichen ersetzen."
"İndim Havuz Başına (Τι τα θέλεις τα λεφτά)"
#v+ a="İndim Havuz Başına (Τι τα θέλεις τα λεφτά)" echo "a"|awk '{print tolower($0)}' indim havuz başına (τι τα θέλεις τα λεφτά) #v- #v+ echo "$a" | perl -ne 'print lc' İndim havuz başına (Τι τα θέλεις τα λεφτά) #v- (hm, keine Ahnung warum das nicht funktioniert. David wird uns sicherlich erhellen ;) #v+ echo "$a"| python -c 'import sys; print(sys.stdin.read().lower())' "İndim havuz başına (Τι τα θέλεις τα λεφτά)" #v- (Auch hier, keine Ahnung.) #v+ echo "$a" | sed 's/[[:upper:]]/\L&/g' "indim havuz başına (τι τα θέλεις τα λεφτά)" #v- Vim: "indim havuz başına (τι τα θέλεις τα λεφτά)" Es fällt auf, dass überall kein richtiges ı generiert wird, sondern immer ein kleines i. Aber ich hab das auch hier mit meiner locale de_DE.UTF-8 getestet. Türkische Lokale habe ich halt nicht da. Ansonsten scheint es doch implementierungsspezifische Unterschiede zu geben. Mit freundlichen Grüßen Christian -- hundred-and-one symptoms of being an internet addict: 219. Your spouse has his or her lawyer deliver the divorce papers... via e-mail. -- 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
![](https://seccdn.libravatar.org/avatar/c99138e4897316b9435eac8ae519f498.jpg?s=120&d=mm&r=g)
Hallo zusammen, On Montag 04 Mai 2009, Christian Brabandt wrote:
Es fällt auf, dass überall kein richtiges ı generiert wird, sondern immer ein kleines i.
Weil das große I auch einen Punkt trägt. ;) Liebe Grüße Erik -- "Eine Frau ist eine Frau, aber eine gute Zigarre, das ist noch ein bißchen mehr." Zino Davidoff Erik P. Roderwald * Uhlenhoffweg 18 * 21129 Hamburg Telefon: +49 (0)40 8510 3150 * Fax: +49(0)40 8510 3148 http://www.zigarren-rollen.de -- 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
![](https://seccdn.libravatar.org/avatar/27023f5ba9c8e122060340126d06642c.jpg?s=120&d=mm&r=g)
Hi Erik! On Mo, 04 Mai 2009, Erik P. Roderwald wrote:
Hallo zusammen,
On Montag 04 Mai 2009, Christian Brabandt wrote:
Es fällt auf, dass überall kein richtiges ı generiert wird, sondern immer ein kleines i.
Weil das große I auch einen Punkt trägt. ;)
Da schau her, das erklärt einiges ;) Mit freundlichen Grüßen Christian, heute betriebsblind… -- hundred-and-one symptoms of being an internet addict: 221. Your wife melts your keyboard in the oven. -- 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
participants (4)
-
Al Bogner
-
Christian Brabandt
-
David Haller
-
Erik P. Roderwald