Forum Programmation.shell question regex

Posté par  .
Étiquettes : aucune
2
27
jan.
2009
Bonjour,

je soumets la question ici avant de soumettre éventuellement un rapport de bug, pour etre bien sur que j'ai pas manqué quelque chose.

Voici le probleme : j'ai des noms du type HELLOhello, constitués d'une premiere partie en majuscules, la seconde en minuscules (si elle existe). Je ne voudrais garder que la première. J'ai donc écris un petit one-liner sed, voila ce que ça donne :

$ echo HELLOa |sed -r "s/([A-Z]+)[a-z]*/\1/g"

renvoie bien HELLO, mais
$ echo HELLOb |sed -r "s/([A-Z]+)[a-z]*/\1/g"
renvoie HELLOb.
je precise : GNU sed version 4.1.5

Donc la question : pourquoi ? :)
  • # COINcoin

    Posté par  . Évalué à 2.

    chez moi cela fonctionne bien (gnu sed 4.1.5 également) :

    ~$ echo HELLOb |sed -r "s/([A-Z]+)[a-z]*/\1/g"
    HELLO
    ~$ echo HELLObebe |sed -r "s/([A-Z]+)[a-z]*/\1/g"
    HELLO
    ~$ echo HELLOa |sed -r "s/([A-Z]+)[a-z]*/\1/g"
    HELLO

    un problème sur ta machine ?

    Only wimps use tape backup: real men just upload their important stuff on megaupload, and let the rest of the world ~~mirror~~ link to it

    • [^] # Re: COINcoin

      Posté par  . Évalué à 1.

      Merci d'avoir testé.
      ça ne marche toujours pas chez moi (.com)
      J'ai essayé sur deux machines différentes, toutes deux mandriva.
      A noter : ça marche avec les range posix [:upper:] et [:lower:]. En guise de sparadrap ...
      • [^] # Re: COINcoin

        Posté par  . Évalué à 2.

        je teste avec une mandriva 2009 en livecd. Effectivement cela ne fonctionne plus ici.

        Mais tout ce qui commence par "a" fonctionne :

        echo HELLOacoco |sed -r "s/([A-Z]+)[a-z]*/\1/g"

        alors que cela ne fonctionne pas :
        echo HELLOcoco |sed -r "s/([A-Z]+)[a-z]*/\1/g"

        Mais si on tape :
        echo HELLOcoco |sed -r "s/([A-Z]+)[a-z].../\1/g"

        cela retire bien les 4 dernières lettres.

        Only wimps use tape backup: real men just upload their important stuff on megaupload, and let the rest of the world ~~mirror~~ link to it

        • [^] # Re: COINcoin

          Posté par  . Évalué à 1.

          Merci encore d'avoir pris le temps de regarder ça.
          Du coup, je ne sais pas trop à qui remonter le probleme. Sed ? Mandriva ?
          Je vais essayer sur d'autres machines pour voir.
          • [^] # Re: COINcoin

            Posté par  (site web personnel) . Évalué à 2.

            Je pense qu'il faut le remonter à mandriva : qa.mandriva.com

            J'ai fait le test sur une Mandriva 2007.1, 2008.1 et 2009.0, et même comportement. Soit c'est voulu (mais là j'ai du mal à voir pourquoi), soit c'est un bug.
  • # Chémoicamarche

    Posté par  (site web personnel) . Évalué à 1.

    .com
  • # problème lié au shell?

    Posté par  (site web personnel) . Évalué à 2.

    Chez moi je dois échapper les parenthèses, je sais pas exactement pourquoi mais je crois que c'est lié au shell. Essaie peut-être avec un backslash devant chaque parenthèse?
    • [^] # Re: problème lié au shell?

      Posté par  . Évalué à 2.

      Normalement, c'est pour ne pas avoir à echapper les parentheses que j'ai mis l'option -r (extended regex). ça ne marche effectivement pas si on les echappe.
  • # Locale

    Posté par  (site web personnel) . Évalué à 7.

    [A-Z] n'est pas ce que tu crois

    En français (ou en anglais) c'est aAbBcC...zZ donc A-Z ca fait toutes les majuscules + toutes les minuscules sauf a


    [pterjan@plop tmp]$ echo HELLObezbe | sed -r 's/^([A-Z]*).*$/\1/g'
    HELLObezbe
    [pterjan@plop tmp]$ echo HELLObeabe | sed -r 's/^([A-Z]*).*$/\1/g'
    HELLObe
    [pterjan@plop tmp]$ echo HELLObeabe | LC_ALL=C sed -r 's/^([A-Z]*).*$/\1/g'
    HELLO
    [pterjan@plop tmp]$ echo HELLObeabe | LC_ALL=en_US sed -r 's/^([A-Z]*).*$/\1/g'
    HELLObe
    • [^] # Re: Locale

      Posté par  . Évalué à 1.

      Merci beaucoup pour l'explication !
      Conclusion : se fier plutot à [:upper:] et [:lower:], ou passer en locale LC_ALL=C
      Encore merci
    • [^] # Re: Locale

      Posté par  . Évalué à 2.

      mince grillé j'allai faire exactement la même :)
      je crois que c'est depuis le passage à l'utf8 cette blague, avant ça posait pas de problème

      Il ne faut pas décorner les boeufs avant d'avoir semé le vent

    • [^] # Re: Locale

      Posté par  . Évalué à 2.

      Dans le genre contre-intuitif, il est difficile de trouver aussi bien :-)
      Tout comme les caractères accentués qui sont quasi impossibles à filtrer (même cause), et probablement d'autres plaisanteries sur lesquelles je ne suis pas encore tombé.
      Comme rendre inutilisable un très bon outil.
      • [^] # Re: Locale

        Posté par  . Évalué à 2.

        et comment cela se fait que cela apparait sur certains systèmes (ici mandriva) et pas sur d'autres ?

        Only wimps use tape backup: real men just upload their important stuff on megaupload, and let the rest of the world ~~mirror~~ link to it

        • [^] # Re: Locale

          Posté par  (site web personnel) . Évalué à 3.

          Définition de LC_COLLATE ? D'autres distribs auraient sed qui ignore LC_COLLATE ?

          C'est pareil avec ls:
          $ echo $LC_COLLATE
          fr_FR
          $ touch A a z Z b
          $ ls
          a A b z Z
          • [^] # Re: Locale

            Posté par  . Évalué à 2.

            ok, merci beaucoup de l'information. Je ne connaissais pas cette variable. Sur mon Archlinux echo $LC_COLLATE donne C, sur Debian cela ne renvoie rien.

            Only wimps use tape backup: real men just upload their important stuff on megaupload, and let the rest of the world ~~mirror~~ link to it

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.