auch diese Antwort bitte asl **off-topic** markieren ;-) On Mon, 7 Oct 2002, David Haller wrote:
Was is'n dein tr fuer ein Teil??? Mein tr kann das. $ tr --version tr (GNU textutils) 2.0.10
perl -pe 'use locale;s#(\w)#$x=$1;($x=~/[[:lower:]]/)? uc($x) : lc($1)#eg'
$ echo 'Täst' | tr '[:lower:][:upper:]' '[:upper:][:lower:]' tÄST $ echo $LANG en_US.ISO_8859-15
==== Usage: tr [OPTION]... SET1 [SET2] [..] SETs are specified as strings of characters. Most represent themselves. Interpreted sequences are: [..] CHAR1-CHAR2 all characters from CHAR1 to CHAR2 in ascending order [CHAR*] in SET2, copies of CHAR until length of SET1 [CHAR*REPEAT] REPEAT copies of CHAR, REPEAT octal if starting with 0 [:alnum:] all letters and digits [:alpha:] all letters [:blank:] all horizontal whitespace [:cntrl:] all control characters [:digit:] all digits [:graph:] all printable characters, not including space [:lower:] all lower case letters [:print:] all printable characters, including space [:punct:] all punctuation characters [:space:] all horizontal or vertical whitespace [:upper:] all upper case letters [:xdigit:] all hexadecimal digits [=CHAR=] all characters which are equivalent to CHAR [..] ====
Der Witz ist: Auch perl hat ein 'tr' operator (als alias fuer 'y'):
perl -pe 'y/a-z/A-Z/' oder perl -pe 'tr/a-z/A-Z/'
und aehnliches... Aber obiges à la 'tr' geht dann doch nicht, da perl scheinbar die Charakterklassen dort nicht interpretiert...
ich habe aus der mail nur das Wesentlich stehen lassen. Ohne jemanden zu nahe zu tretten wuerde ich die diversen Kommentare und Vorschlaege einfach unter das bekannte Zitat: "den sie wissen nicht was sie tun" einordnen. RTFM ist nicht genug. Wenn man meint es verstanden zu haben, dann probiert man es aus und stellt fest dass es doch anders ist :-o Nun, das ist eine Linux Liste, ein Teil meine Erklaerungen ist darum wohl fuer die meisten nicht relevant, zum Verstaendnis aber vielleicht hilfreich. Ich will nicht sagen dass die Aussagen falsch sind, aber richtig sind sie i.A. auch nicht (ausser bei der perl Loesung mit lc und uc, da bin ich nicht sicher). Also zu den Fakten: 1. GNU tr kennt die SETs (Term uebernommen aus der man-page) 2. perl arbeitet mit POSIX character class 3. "tr a-z A-Z" bzw. "perl -e tr/a-z/A-Z/" liefern unzuverlaessige Ergebnisse 4. das Environment ist von Bedeutung 5. die libc und/oder libregex ist von Bedeutung 6. "POSIX character class" sind etwas anderes als "character class" in regulaeren Ausdruecken (tr, perl), bitte nicht verwechseln Mit anderen Worten: man weis eigentlich gar nicht so genau was passiert. Ausser vielleicht bei: env LANG=C perl -Ulocale ... Erklaerung: 1. GNU tr benutzt auch die POSIX character class 2. perl benutzt auch die POSIX character class (aber nicht bei tr/ und y/ wenn nicht explizit angegeben) 3. ist abhaengig vom Zeichensatz, z.B. ASCII oder EBCDIC 4. z.B. LANG, LD_LIBRARY_PATH, /etc/ldconfig.conf 5. Version der Libs, bzw. static vs. dynamically liked Programme (tr, perl) 6. die tr man-page umgeht das geschickt indem sie SET verwendet Beispiele: - wenn man tr a-z A-Z auf einem System mit EBSDIC benutzt, kommt sicher nicht die Konvertierung von Klein nach Gross raus echo abcdefghijklmnopqrstuvwxyz123456789|dd conv=ebcdic|tr a-z A-Z aber echo abcdefghijklmnopqrstuvwxyz123456789|dd conv=ebcdic|dd conv=ucase - wenn LANG=RU eingestellt ist, und der Zeichensatz KOI8R darf man auch ueberrascht sein - man hat ein static linked tr (warumauchimmer) in der die eingebundene libc und/oder libregex noch nicht voll POSIX konform war Zur Kompletierung der Verwirrung noch: echo Müll|dd conv=ucase (unterliegt natuerlich den gleichen Einschraenkungen) Ach so, wer noch mehr solche obskuren Beispiele braucht, sollte mal in Jeffrey Friedls "Regular Expressions" reinschauen (gibts irgendwo auch im Internet). Trotzdem: don't panic da wir (fast) alle in der ASCII-POSIX-Welt leben und arbeiten, und nicht irgendwo im Cafe Millyway, haette ich mir die ganzen Ausfuehrungen sparen koennen. Viel Spass beim Ausprobieren :-)) Achim