POSIX != GNU ( LANG / shell "replacement(s) )

  • Morgen


    http://www.heise.de/ix/artikel/2001/09/139/


    Zitat:


    Geht es nach POSIX, soll der Benutzer Zeichenbereiche (‘range expressions’) wie [A-Z] in Shell-Mustern und regulären Ausdrücken nicht mehr verwenden, weil deren Bedeutung mit der eingestellten Landessprache variiert. Hat die Umgebungsvariable LANG den Wert de_DE, findet grep ‘[A-Z]’ nicht mehr nur die Versalien, sondern fast alle Buchstaben, einschließlich des ‘ß’ und der Umlaute; lediglich das kleine ‘a’ bleibt unerkannt. Ist dagegen LANG=C eingestellt oder die Variable nicht gesetzt, verhält sich grep wie gewohnt.


    Eine Frage zu ^^^^, zweite Ausgabe, der folgenden Zeilen wird benötigt.


    Code
    shell> locale | grep ^LANG
    LANG=de_DE.UTF-8
    shell> VAR=01234abcdeABCDE
    shell> echo ${VAR//[A-Z]}
    01234a -> :-((
    
    
    shell> eval LANG=C echo ${VAR//[A-Z]}
    01234abcde -> :-))


    Ist für ein Skript, welches auch in de_DE.UTF-8 laufen soll.


    Kann doch nun nicht, das komplette Skript auf LANG=C (HEAD) setzen, da würde die Internationalisierung nicht mehr funktionieren...


    Gibt es hier eine Alternative, ohne das ich vor jeden Befehl, ein LANG=C setzen muß?


    LG Ronny

  • Es sollte normalerweise genügen, nur LC_COLLATE="C" zu setzen, um die Sortierordnung der Buchstaben zu erzwingen. Damit hättest du immerhin die restlichen Meldungen in lokaler Sprache.


    Dein Beispiel eval LANG=C echo ${VAR//[A-Z]} läuft bei mir übrigens in keiner Variante, selbst nicht in ' ' gekapselt. Die shellinternen Ersetzungsregeln greifen wohl zu früh.


    Wenn es nur um einzelne Kommandos wie grep geht, wie wär's mit folgendem Trick:


    GREP=`which grep` ; grep() { LANG="C" $GREP "$@" ; }



    Gruß,


    Udo


  • Nabend


    Danke, das war es schon :-))


    Wäre nicht nur grep, auch (${VAR//[A-Z]} ^^^^^^^^^^).


    LG Ronny

  • Hallo,


    Code
    marc@siduxbox:~$ locale | grep ^LANG
    LANG=de_DE.UTF-8
    marc@siduxbox:~$ VAR=01234abcdeABCDE
    marc@siduxbox:~$ echo ${VAR//[[:upper:]]}
    01234abcde
    marc@siduxbox:~$


    Gruß
    Marc

  • Zitat

    Original von zulu
    Hallo,


    Code
    marc@siduxbox:~$ locale | grep ^LANG
    LANG=de_DE.UTF-8
    marc@siduxbox:~$ VAR=01234abcdeABCDE
    marc@siduxbox:~$ echo ${VAR//[[:upper:]]}
    01234abcde
    marc@siduxbox:~$


    Gruß
    Marc


    Hallo


    Mercy


    Auch eine Lösung, noch eine Frage, gibt es hier für auch was:


    Code
    shell> VAR="=\"ABCDE123abc"
    shell> echo ${VAR//[A-Z,0-9,\",=]}
    xyz


    Das scheint ja nicht zu funzen?


    Code
    ${VAR//[[[:upper:]],\",=]}


    LG Ronny

    2 Mal editiert, zuletzt von ronnykornexl ()

  • Hallo,


    Code
    marc@siduxbox:~$ VAR="=\"ABCDE123abc"
    marc@siduxbox:~$ echo ${VAR//[[:upper:],\",=]}
    123abc
    marc@siduxbox:~$ echo ${VAR//[[:upper:],[:digit:],\",=]}
    abc
    marc@siduxbox:~$ echo ${VAR//[[:lower:],[:digit:],\",=]}
    ABCDE
    marc@siduxbox:~$ echo ${VAR//[[:alpha:],\",=]}
    123
    marc@siduxbox:~$


    Gruß
    Marc

  • Alles klar, hatte dann wohl jeweils ein [] zuviel drinnen.


    Werde wohl bei LC_COLLATE="C" bleiben, man ist ja Faul :lol2


    LG Ronny

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!