Forum Programmation.shell Transformer une chaine de caractères en bash

Posté par . Licence CC by-sa.
Tags :
0
27
juin
2018

Bonjour, en entrée, j'ai une chaine de la forme « YYYXX » et je voudrais écrire une fonction bash qui me la transforme en « XX-YYY » où XX est du texte de longueur variable (typiquement entre 1 et 3 caractères) et pouvant prendre n'importe quelle lettre ASCII (majuscule ou minuscule) et YYY est un nombre de taille variable pouvant aller de 1 à 999.

Par exemple, je voudrais transformer « 252Cf » et « Cf-252 ».

Je n'ai aucune idée de l'outil qui permet de faire cela. Merci d'avance pour votre aide.

  • # sed, awk et leurs amis

    Posté par . Évalué à 5.

    au pif je dirais qu'il faut deja rechercher l'expression reguliere chiffre 1 à 999, peux-tu avoir un modele 1Cf ou bien c'est 001Cf ?

    puis l'expression reguliere pour les 1 à 3 lettres qui suivent.

    ensuite sed doit permettre de rechercher/remplacer
    sed -e 's/(motif1)(motif2)/\2-\1/g'

    d'autres outils peuvent faire la meme chose

  • # Solution

    Posté par . Évalué à 2.

    J'imagine que ce n'est pas ce qu'il y a de plus élégant mais voici la fonction que j'ai écrite

    function format() {
        name=$1
        text=""
        number=""
    
        for i in $(seq 1 ${#name}); do
    
        #si c'est du texte (et pas un chiffre), on garde
        if [[ ${name:i-1:1} = *[[:ascii:]]* && ${name:i-1:1} != *[[:digit:]]* ]]; then
            text="${text}${name:i-1:1}"
        fi
        #si c'est un chiffre, on garde
        if [[ ${name:i-1:1} = *[[:digit:]]* ]]; then
            number="${number}${name:i-1:1}"
        fi
        done
        echo "${text}-${number}"
    }
  • # alors

    Posté par (page perso) . Évalué à 3.

    En quelques lignes (qu'on peut fusionner mais j'ai voulu ça un minimum didactique), ça donne ça :

    chaine="123cf"
    tmp=$(echo $chaine | fold -w3)
    arr=($(echo $tmp | tr " " "\n"))
    echo ${arr[1]}-${arr[0]}

    et tu obtiens bien cf-123

  • # man bash : remplacement des paramètres

    Posté par . Évalué à 7. Dernière modification le 28/06/18 à 08:22.

    Salut,

    $ var="252Cf"
    
    $ echo "${var//[[:digit:]]}-${var//[[:alpha:]]}"
    Cf-252

    ;-)

Suivre le flux des commentaires

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