Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème récupération chaîne de caractère

Sujet résolu
    22 avril 2015 à 19:24:14

    Bonjour à tous,

    Je travaille sous cygwin, avec du KSH.

    J'ai une variable qui contient ceci :

    echo $var

    aaaa-a-1_aa:[bbbb zear qsd3]|wwww-w-1_ww:[uytr pppp lmp5]

    Je souhaite récupérer [bbbb zear qsd3] ainsi que [uytr pppp lmp5] et ranger ces valeurs dans un tableau (crochets et texte à l'intérieur compris). 

    Si quelqu'un peut me venir en aide je suis preneur !!!

    Merci par avance,

    Bonne soirée à vous !!!

    • Partager sur Facebook
    • Partager sur Twitter
      22 avril 2015 à 22:01:48

      salut,

      $ var="aaaa-a-1_aa:[bbbb zear qsd3]|wwww-w-1_ww:[uytr pppp lmp5]"
      $ var="[${var#*\[}"                                                                           
      $ var="${var%\]*}]"                                                                           
      $ oIFS="$IFS"; IFS=$'\n'; set -A array $(echo "${var//\]*\[/\]$'\n'\[}"); IFS="$oIFS"
      $ printf '%s\n' "${array[@]}"                                                        
      [bbbb zear qsd3]
      [uytr pppp lmp5]

      je te laisse le soin de trouver dans le man de ksh les explications pour rédiger les commentaires requis.

      • Partager sur Facebook
      • Partager sur Twitter

      Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique

        23 avril 2015 à 10:35:57

        J'obtiens :
        -bash: set: -A : option non valable
        set : utilisation :set [-abefhkmnptuvxBCHP] [-o nom-option] [--] [arg ...]
        comme retour sur mon terminal.
        Problème de package cygwin? Autre? 
        Merci :D
        • Partager sur Facebook
        • Partager sur Twitter
          23 avril 2015 à 12:18:03

          KSH est un nom quasiment générique. De nombreux shells, tous issus de celui de David Korn s'appellent ainsi : ksh88, pdksh, lksh, mksh, ksh93; et il y en a peut-être d'autres.

          que retourne : echo $KSH_VERSION (par curiosité) ?

          remplace le set -A, en conservant la substitution de commandes, par un affectation de tableau normale.
          • Partager sur Facebook
          • Partager sur Twitter

          Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique

            23 avril 2015 à 13:07:02

            Le echo version ne renvoi rien de même que l'affectation à un tableau normale. Vide.

            En fait l'idée aurait été de récupérer dans :

            1:[bbbb zear qsd3]|2:[uytr pppp lmp5]

            1 et 2 pour les mettre dans un tableau ainsi que [bbbb zear qsd3] et [uytr pppp lmp5] pour les mettre dans un autre. J'ai demandé pour les crochets pensant arriver à récup 1 et 2 seul mais j'avoue que je n'y arrive absolument pas. Ces chaînes de caractère sont un vrai cauchemard.

            A la limite si tu as un moyen de récup 1 et 2 dans un tableau et [bbbb zear qsd3] et [uytr pppp lmp5] dans un autre a partir d'une chaîne comme celle-ci :

            1 [bbbb zear qsd3] 2 [uytr pppp lmp5]

            Je suis preneur aussi cela semble plus simple.

            Merci pour ton aide et ton temps. :D

            • Partager sur Facebook
            • Partager sur Twitter
              23 avril 2015 à 13:35:43

              quels 1 et 2 ? les indices des tableaux sont initialisés à 0, par défaut.


              t'es sûr d'avoir accès à ksh sur cygwin ? car, à ce que j'ai pu voir, cygwin fournit mksh, qui supporte la forme set -A.
              as-tu tenté de créer un simple tableau (en dehors de toute manipulation de chaîne) ?

              • Partager sur Facebook
              • Partager sur Twitter

              Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique

                23 avril 2015 à 14:04:26

                Pardon je me suis mal exprimé. 

                Ma question était la suivante : Considérons cette chaîne :

                135:[bbbb zear qsd3]|5698:[uytr pppp lmp5]

                Comment puis-je récupérer dans un tableau : 135 et 5698 puis dans un autre tableau :[bbbb zear qsd3] et [uytr pppp lmp5]

                sinon le package mksh est installé oui et je peux créer des tableaux simple sans problème :)

                • Partager sur Facebook
                • Partager sur Twitter
                  23 avril 2015 à 14:59:51

                  ah, oui ! et tu es sûr d'utiliser KSH ? car, normalement, il devrait retourner quelque chose quand tu demandes l'affichage de la version.

                  et $BASH_VERSION, ça affiche quelque chose ?

                  règle la variable environnementale IFS pour read uniquement (IFS='séparateurs' read ...)pour qu'elle contienne les séparateurs de ta chaîne pour obtenir un tableau.

                  ensuite, boucle sur les indices du tableau : les indices pairs contiennent les nombres, les indices impairs contiennent les chaînes entre crochets (crochets compris).

                  • Partager sur Facebook
                  • Partager sur Twitter

                  Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique

                    23 avril 2015 à 15:08:22

                    ok, mon sha-bang : #!/bin/ksh et j'utilise la syntaxe KSH pour tout mon code.

                    Par contre effectivement : $BASH_VERSION

                    affiche : 4.3.33(1)-release

                    Ainsi donc mon script est un bash? Du coup concrêtement ça change quoi vis-à-vis du code que tu m'as donné? il me semblait pourtant que bash et ksh étaient très proches voir fortement compatible sur certains éléments comme les structures de contrôle par exemple.

                    • Partager sur Facebook
                    • Partager sur Twitter
                      23 avril 2015 à 15:30:17

                      mais pas pour la construction des tableaux, de toute évidence.

                      normalement, je n'utilise pas ksh.

                      bash me contente.

                      donc, ton shell de connexion est bash.

                      pas de problème : pour tes tests, tu n'as qu'à appeler ksh depuis la ligne de commande; et alors $KSH_VERSION renverra quelque chose.

                      ton script, lui devrait fonctionner avec l'instruction set -A.

                      • Partager sur Facebook
                      • Partager sur Twitter

                      Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique

                        23 avril 2015 à 15:40:42

                         Bouep la par contre tu m'as perdu^^...appeler ksh depuis la ligne de commande? Je viens testé une commande permettant de changer le shell de connexion de ce format :  chsh [ -s shell ] [ -l ] [ -u ] [ -v ] [ utilisateur ] rien de bien probant à l'horizon^^commande introuvable. J'aurai bien utilisé bash mais c'est une spec que je dois impérativement respecter. 

                        • Partager sur Facebook
                        • Partager sur Twitter
                          23 avril 2015 à 15:55:46

                          tu te connectes : tu arrives sur bash.

                          sur la ligne de commande, tu tapes ksh

                          et hop, tu es dans ksh (un shell est un programme comme un autre).

                          le shell de connexion se configure probablement au niveau de cygwin...

                          EDIT:

                          au fait, pourquoi KSH ?

                          -
                          Edité par dantonq 23 avril 2015 à 15:56:08

                          • Partager sur Facebook
                          • Partager sur Twitter

                          Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique

                            23 avril 2015 à 16:06:42

                            spec client, je n'ai malheureusement pas le droit d'expliquer ce genre de choses (je suis le nouveau stagiaire ;) et mon boss n'apprécierait pas ) J'ai commencé Unix il y'a deux semaines, je commence à me débrouiller mais reste toujours ces chaînes de caractère que je n'arrive pas à manipuler. Hormis avec grep et awk généralement sa passe. Mais là....pas des masses. Parfait pour ksh je viens de faire fonctionner cela :D merci. Je vais maintenant tester si le tuyau pour le tableau fonctionne et je t'envoi un retour dans deux minutes ;)
                            • Partager sur Facebook
                            • Partager sur Twitter
                              23 avril 2015 à 16:12:26

                              Parfait tout fonctionne :D je ne saurais comment te remercier (si tu passe sur Toulouse je t'offre une pression^^). Maintenant me reste à récupérer la première partie de la chaîne de caractère...135:[bbbb zear qsd3]|5698:[uytr pppp lmp5], le 135 et le 5698...J'ai pas vraiment compris ton explication sur le tableau et les index pair et impair, l'idée serait d'avoir 2 tableau : le premier pour mes nombres et le deuxième pour mes caractères entre crochet et non pas un seul tableau contenant tout.
                              • Partager sur Facebook
                              • Partager sur Twitter
                                23 avril 2015 à 16:19:57

                                je te montre en BASH:

                                $ var="135:[bbbb zear qsd3]|5698:[uytr pppp lmp5]"
                                $ IFS=':|' read -a ar <<<"$var"
                                $ for ((i=0;i<${#ar[@]};i++)); do ((i%2)) && chaines+=( "${ar[i]}" )|| nombres+=( "${ar[i]}" ); done
                                $ printf '%s\n' "${nombres[@]}"
                                135
                                5698
                                $ printf '%s\n' "${chaines[@]}"
                                [bbbb zear qsd3]
                                [uytr pppp lmp5]

                                il faudra peut-être adapter pour ksh.


                                au fait, pourquoi ksh ?

                                • Partager sur Facebook
                                • Partager sur Twitter

                                Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique

                                  23 avril 2015 à 16:29:31

                                  Je t'ai marqué plus haut pour la raison concernant KSH, je suis stagiaire en fait dans une SSII et j'ai démarré UNIX y'a 2 semaines, dc je commence à me débrouiller mais avec les chaînes c'est tendu. Mon client veut du KSH c'est impératif, mais vis-à-vis de mon boss je ne préfère pas révéler des infos sur leur archi...Moi même on ne m'a pas donné toutes les explications xD en tous cas t'es un chic type merci beaucoup pour ta patience et ton temps :D j'aimerais pouvoir te renvoyer l'ascenceur mais me faudra encore me perfectionner sur UNIX^^
                                  • Partager sur Facebook
                                  • Partager sur Twitter

                                  Problème récupération chaîne de caractère

                                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                  • Editeur
                                  • Markdown