Forum Programmation.shell Plus de 9 parenthèses de mémorisation ?

Posté par  .
Étiquettes : aucune
0
16
août
2007

bonjour


Quand on utilise des parenthèses de mémorisation, avec SED par exemple, on identifie son contenu à un chiffre que l'on écrit de cette façon : \1 \2 etc...



Mais comment cela se passe-t-il quand on arrive à dix ? De quelle façon doit-on le noter ?



<voici un exemple :


 echo abcdefghij | sed 's#\(a\)\(b\)\(c\)\(d\)\(e\)\(f\)\(g\)\(h\)\(i\)\(j\)#\1\2\3\4\5\6\7\8\9\10#'

Comment fais-je pour récupérer le "j" ?



Merci d'avance

  • # pourquoi faire compliquer...

    Posté par  . Évalué à -1.

    il doit bien avoir un systeme pour recuperer le

    Nieme caractere d'une chaine.

    dans ton cas n=10, resultat =>j
    • [^] # Re: pourquoi faire compliquer...

      Posté par  . Évalué à 1.

      D'accord pour cet exemple. Sauf que bien sûr je souhaite l'utiliser dans des cas plus complexes où ton idée ne serait pas utilisable
      • [^] # Re: pourquoi faire compliquer...

        Posté par  . Évalué à 2.

        D'apres la doc de super sed, precisement [http://www.ugcs.caltech.edu/manuals/unix/ssed-3.62/sed_42.ht(...)], tu mets autant de chiffres que tu veux, et les mecanismes de gestion des nombres post-backslash sont precisees sur [http://www.ugcs.caltech.edu/manuals/unix/ssed-3.62/sed_36.ht(...)]. Il y semblerait que la limite soit a 99.

        Mais dans la doc de GNU sed, section "Backreferences"
        [http://www.gnu.org/software/sed/manual/sed.html#index-Backre(...)] il est seulement prevu de gerer les 9 chiffres non-nuls.

        Donc visiblement, ca depend des implementations de sed, et en l'occurence, super sed (paquet debian ssed) devrait repondre a ton probleme. Sauf que chez moi ca marche pas. Je precise que j'utilise la version correspondant a la doc (3.62).
        • [^] # Avec Minitrue

          Posté par  . Évalué à 1.

          • C'est effectivement ce que je recherche, malheureusement je n'y arrive pas non plus (même version de ssed, 3.62, paquet Ubuntu)
          • En revanche j'ai réussi avec un autre outil qui permet de faire de la substitution : Minitrue, http://www.idiotsdelight.net/minitrue/
          • Ce qui me semble bizarre avec Minitrue, c'est que, en reprenant mon exemple, le "j" est identifié au \12 et non au \10 ! Mais il faut dire que je ne connais pas du tout cet outil !

          Exemple :

          echo abcdefghij | minitrue -o  "(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)"  = "\1\2\3\4\5\6\7\8\9\12"

          Dommage que Minitrue ne soit plus développé depuis fin 1999…

          • [^] # Re: Avec Minitrue

            Posté par  . Évalué à 1.

            J'aurais mieux fait de lire directement la doc. C'est bien identifié au 10, mais sous la forme \v10 :
            \(digit) represents the parentheses contents for parentheses 1 through 9. Parentheses between 10 through 99 are represented by \v(digit)(digit)
            effectivement ça fonctionne
        • [^] # Egalement avec Perl

          Posté par  . Évalué à 1.

          Fonctionne également sans problème avec Perl.
          echo abcdefghij | perl -pe  's/(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)/$10/g'

Suivre le flux des commentaires

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