Forum Programmation.shell Inverser une chaine de caractères

Posté par  .
Étiquettes : aucune
0
17
juin
2005
Salut,

j'ai une chaine:

SNMPv2-SMI::enterprises.3582.1.1.3.1.7.0.0.0

je voudrais la renverser, pour recuperer le 0 à la fin. Le probleme c'est que je ne peux pas utiliser tr car la j'ai du texte, mais c'est pas forcement toujours le cas suivant les machines. Donc la solution que je trouve la plus pratique est d'inverser la chaine, de faire un cut -d "." -f1 pour recuprer la derniere valeur (qui n'est pas forcement 0).

sort joue seulement avec des lignes et pas avec des caractères donc je ne sais pas comment y arriver. Il faudrait que ca reste en bash (je pourrais utiliser du perl ou autre mais je ne prefere pas).

Est ce que quelqu'un à une idée ? Connait une option miracle ?

Merci d'avance !
  • # OK OK OK

    Posté par  . Évalué à 4.

    echo SNMPv2-SMI::enterprises.3582.1.1.3.1.7.0.0.0 | rev

    ;)
    • [^] # Re: OK OK OK

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

      La solution complète :
      echo SNMPv2-SMI::enterprises.3582.1.1.3.1.7.0.0.0 | rev | cut -c -1

      (prends le dernier caractere de la chaîne)
  • # Pourquoi la renverser ?

    Posté par  . Évalué à 3.

    Il est plus simple de prendre la séquence de chiffres suivant le dernier point
    sed fait ça très bien

    echo SNMPv2-SMI::enterprises.3582.1.1.3.1.7.0.0.0 | sed 's/.*\.\([0-9]*\)$/\1/'
    0

    Ca évite en plus de devoir inverser le résultat s'il est supérieur à 9
    • [^] # Re: Pourquoi la renverser ?

      Posté par  . Évalué à 3.

      Ou bien on peut utiliser du pur bash aussi :

      % plop="SNMPv2-SMI::enterprises.3582.1.1.3.1.7.0.0.0"
      % echo ${plop##*.}
      0

      (question de goût, mais c'est vraiment infiniment plus rapide si jamais il y a beaucoup de lignes à traiter en boucle)
      • [^] # Oui en bash ( forme générale )

        Posté par  . Évalué à 1.

        On peut aussi prendre le derniere caractère sans se soucier de la forme particulier de la chaine ( toujours en bash ) :

        brol="SNMPv2-SMI::enterprises.3582.1.1.3.1.7.0.0.0"
        echo ${brol:${#brol}-1:1}
        • [^] # Re: Oui en bash ( forme générale )

          Posté par  . Évalué à 2.

          Pour garder juste le dernier caractère, tu as ça aussi qui est rigolo :
          % echo "${plop#${plop%?}}"
          C'est donc "la chaine privée d'un préfixe qui correspond à la chaine privée de son dernier caractère".

          Et puis aussi, en Bash-3 avec une regexp, pour garder tous les derniers chiffres si c'est bien par des chiffres que la chaine termine :
          % [[ "${plop}" =~ "[0-9]+$" ]] && echo "${BASH_REMATCH}"
          (pratique parceque tu peux en même temps gérer les chaines incorrectes avec un if/then/else)

          Bref, que de solutions... :)
  • # man tail ?

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

    echo SNMPv2-SMI::enterprises.3582.1.1.3.1.7.0.0.0 | tail -n1
    ?

Suivre le flux des commentaires

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