Découpage chaîne de caractères

zatox Messages postés 663 Statut Membre -  
zatox Messages postés 663 Statut Membre -
Bonjour, dans une chaine j'ai ceci:
124567-5-08-12-127-45
Je voudrais extraire tout ce qui se trouve devant le cinquième - c'est à dire obtenir
124567-5-08-12-127
Ou bien tout ce qui se trouve devant le quatrième - c'est à dire obtenir
124567-5-08-12

Merci pour votre réponse

3 réponses

  1. Utilisateur anonyme
     
    salut,

    « devant le cinquième
    -
    », et « devant le quatrième
    -
    »
    ces nombres sont fixes, ou ou s'agit-il du dernier et de l'avant-dernier
    -
    ?
    c'est-à-dire, la chaîne est-elle susceptible de ne pas avoir toujours ce format, et comporter d'autres
    -
    ?
    0
  2. zatox Messages postés 663 Statut Membre 67
     
    Bonjour, merci pour ta réponse, non la chaîne n'a pas forcément toujours le même format par exemple ça peut-être:
    12-128-1-54-1258-1 ou bien
    123589-12-258-254879-2-58

    Bon j'ai trouvé une solution mais qui n'est pas très élégante:

    #! /bin/bash
    nb_num=4
    while read ligne
    do
    tableau=( ${ligne//-/ } )
    if [ "$nb_num" == 5 ]
    then
    new_line="${tableau[0]} ${tableau[1]} ${tableau[2]} ${tableau[3]} ${tableau[4]}"
    fi
    if [ "$nb_num" == 4 ]
    then
    new_line="${tableau[0]} ${tableau[1]} ${tableau[2]} ${tableau[3]}"
    fi
    if [ "$nb_num" == 3 ]
    then
    new_line="${tableau[0]} ${tableau[1]} ${tableau[2]}"
    fi
    if [ "$nb_num" == 2 ]
    then
    new_line="${tableau[0]} ${tableau[1]}"
    fi

    echo $new_line >> new_fichier.txt
    cpt_fichier_txt=$(($cpt_fichier_txt + 1));

    done < fichier.txt

    echo $new_line


    En fonction de la valeur que je donne à nb_num je récupère la chaîne que je veux mais il doit y avoir mieux que ça je pense.

    Merci pour votre aide.
    0
    1. Utilisateur anonyme
       
      c'est bien.
      $ var='123589-12-258-254879-2-58'
      $ ar=( ${var//-/ } )
      $ n=4
      $ echo ${ar[@]::$n}
      123589 12 258 254879
      $ n=3
      $ echo ${ar[@]::$n}
      123589 12 258
      0
    2. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      Salut,

      On peut aussi…

      $ A="124567-5-08-12-127-45"

      $ grep -o '\([^-]*-\)\{5\}' <<< "${A}"
      124567-5-08-12-127-

      $ grep -o '\([^-]*-\)\{4\}' <<< "${A}"
      124567-5-08-12-

      $ grep -o '\([^-]*-\)\{3\}' <<< "${A}"
      124567-5-08-

      $ echo "${A%-*}"
      124567-5-08-12-127

      $ B="$(echo ${A%-*})"

      $ echo "${B%-*}"
      124567-5-08-12

      Ce n'est pas parfait avec "grep", mais bon… ;-))
      0
      1. Utilisateur anonyme > zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention  
         
        B="${A%-*}"
        0
      2. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501 > Utilisateur anonyme
         
        Exact. Merci ;-)
        0
  3. zatox Messages postés 663 Statut Membre 67
     
    Ah oui merci à tous pour toutes ces solutions bien plus élégantes que la mienne.
    0