Comment récupérer une chaine située après une autre chaine?

lsda26 Messages postés 70 Statut Membre -  
dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,
J'enregistre les informations suivantes dans une variable et le tout est géré en une seul ligne:
...
iso.3.6.1.2.1.17.4.3.1.2.0.35.94.109.63.225 = INTEGER: 24 iso.3.6.1.2.1.17.4.3.1.2.0.36.232.60.84.3 = INTEGER: 7 iso.3.6.1.2.1.17.4.3.1.2.0.36.232.71.106.40 = INTEGER: 242
...

Je cherche par exemple, à pouvoir récupérer la valeur "7" située juste après "0.36.232.60.84.3 = INTEGER: ".
Sachant que la valeur peut comporter plusieurs chiffres comme avant et après.

Vu que toutes mes données sont enregistrées dans une seul ligne je n'arrive pas à utiliser grep + cut.

Merci de votre aide

7 réponses

  1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 502
     
    Salut,

    $ echo "${var}"
    iso.3.6.1.2.1.17.4.3.1.2.0.35.94.109.63.225 = INTEGER: 24 iso.3.6.1.2.1.17.4.3.1.2.0.36.232.60.84.3 = INTEGER: 7 iso.3.6.1.2.1.17.4.3.1.2.0.36.232.71.106.40 = INTEGER: 242
    
    $ echo "${var}" | sed 's/.*0.36.232.60.84.3 = INTEGER: \([^ ]*\) .*/\1/'
    7
    
    $

    0
  2. lsda26 Messages postés 70 Statut Membre
     
    Merci pour l'info,
    J'etait pas pret de trouver cette expression régulière...

    J'ai finis par réussir à utiliser un grep + cut :)
    0
  3. fabinou
     
    Bonjour,

    Désolé de déterrer un peu le sujet, mais je recherche moi aussi une méthode pour extraire un seul caractère au choix dans une variable contenant une chaîne de caractère sur une seule ligne.
    Je serai donc intéressé par la méthode que tu as trouvé, galérant moi aussi.

    Merci =)
    0
    1. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
       
      hello
      montre un exemple de ce que tu veux faire
      0
    2. fabinou
       
      Bonjour,

      en fait, je passe à mon script en paramètre une chaîne de caractère contenant des chiffres (1-9) ou des points, sans espace.

      Du coup, un echo $1 donne par exemple "2243.52474.."

      Ce que je veux, c'est récupérer un à un chaque caractère, d'abord le 2, puis l'autre 2, puis le 4, etc.. Le but est de représenter cela sous forme d'une matrice.

      J'ai essayé comme cela :

      #!/bin/sh 
      
      chaine=$1    
      
      for i in $(seq 0 80)     
      do    
        tab[$i]=$(${chaine:0:1}) 
        echo "tab[$i] "   
      done


      Voici l'erreur que j'obtiens à chaque tour de boucle :

      ./exo2.sh: 7: ./exo2.sh: Bad substitution
      ./exo2.sh: 7: ./exo2.sh: tab[0]=: not found
      tab[0] 
      ./exo2.sh: 7: ./exo2.sh: Bad substitution
      ./exo2.sh: 7: ./exo2.sh: tab[1]=: not found
      tab[1] 
      ./exo2.sh: 7: ./exo2.sh: Bad substitution
      ./exo2.sh: 7: ./exo2.sh: tab[2]=: not found
      tab[2] 
      ./exo2.sh: 7: ./exo2.sh: Bad substitution
      ./exo2.sh: 7: ./exo2.sh: tab[3]=: not found
      tab[3] 
      


      et ainsi de suite jusqu'à la dernière boucle...
      0
  4. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 502
     
    Salut,

    Une solution parmi d'autres...

    $ cat foo.sh 
    #! /bin/bash
    
    chaine=( $(sed 's/./& /g' <<<${1}) )
    
    i=1
    for car in ${chaine[@]}
    do
    echo "Caractère ${i} = ${car}"
    ((i++))
    done
    
    
    $ ./foo.sh "2243.52474.."
    Caractère 1 = 2
    Caractère 2 = 2
    Caractère 3 = 4
    Caractère 4 = 3
    Caractère 5 = .
    Caractère 6 = 5
    Caractère 7 = 2
    Caractère 8 = 4
    Caractère 9 = 7
    Caractère 10 = 4
    Caractère 11 = .
    Caractère 12 = .
    
    $ 

    0
    1. fabinou
       
      Génial, tu as transformé la variable chaîne en tableau du coup, bien que j'ai un peu de mal à comprendre comment ( va falloir que je relise très attentivement le man ). Merci beaucoup !
      0
    2. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 502
       
      La commande "sed" permet d'ajouter un espace après chaque caractère :
      $ echo "2243.52474.." | sed 's/./& /g'
      2 2 4 3 . 5 2 4 7 4 . .
      0
    3. fabinou
       
      oh d'accord, et le "<<<" permet de rediriger la variable vers sed donc ?
      0
    4. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 502
       
      Oui.
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    utiiser /bin/bash au lieu de /bin/sh
    #!/bin/bash
    chaine=$1
    for i in $(seq 0 10)
    do
      tab[$i]=${chaine:$i:1}  # recupère 1 car. aux positions 0, 1, etc
      echo "${tab[$i]} "   # aff. des éléments d'un tableau, ${} obligatoire
     done
    
    0
  7. fabinou
     
    Génial, merci de la réponse, je comprends mieux mes erreurs !
    Et effectivement, par défaut j'étais sous dash et non bash, ça change beaucoup de chose !
    0
  8. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    autres méthodes
    $ i=2243.52474 
    $ tab=( $(grep -o . <<<$i) ) 
    $ echo ${tab[@]} 
    2 2 4 3 . 5 2 4 7 4 
    $  
    $ unset tab 
    $ tab=( $(fold -w1 <<<$i) ) 
    $ echo ${tab[@]} 
    2 2 4 3 . 5 2 4 7 4 
    $  
    $ unset tab
    $ # bash pur
    $ tab=( ${i//*([:digit:])/ })
    $ echo ${tab[@]}
    2 2 4 3 . 5 2 4 7 4
    $ 
    
    0