• # avec perl

    Posté par  . Évalué à 1.

    je suis trop nul avec awk…

    $ perl -e '$s=shift;$n=length $s;$s1=substr $s,0,$n/2;$s2=substr $s,$n/2;print $s1,"\n",$s2,"\n";' pe8e2bdd33ef4ddc8e603eeae602d4da
    pe8e2bdd33ef4ddc
    8e603eeae602d4da
    
    
  • # En Bash

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

    string=pe8e2bdd33ef4ddc8e603eeae602d4dab
    echo -e ${string:0:$((${#string}/2))}\\n${string:$((${#string}/2))}
    
    

    Pour info :

    • ${#string} donne la longueur de $string
    • ${string:p:l} donne la sous-chaîne à partir de la position p et de longueur l
    • ${string:p} donne la sous-chaîne à partir de la position p jusqu'à la fin
    • $((exp)) permet de calculter l'expression mathématique dans les parenthèses.
    • L'option -e de echo permet d'interpréter les backslashes et donc d'interpréter \n comme un passage à la ligne.

    L'association LinuxFr ne saurait être tenue responsable des propos légalement repréhensibles ou faisant allusion à l'évêque de Rome, au chef de l'Église catholique romaine ou au chef temporel de l'État du Vatican et se trouvant dans ce commentaire

    • [^] # Re: En Bash

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

      Pertinent !

      Et si tu veux être 100% portable, tu fais simplement :

      string=pe8e2bdd33ef4ddc8e603eeae602d4dab
      echo "${string:0:$(expr ${#string} / 2)}
      ${string:$(expr ${#string} / 2)}"

  • # Avec awk

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

    echo "pe8e2bdd33ef4ddc8e603eeae602d4da" | awk '{a=length($0); print substr($0,0,a/2); print substr($0,a/2+1,a)}'
    pe8e2bdd33ef4ddc
    8e603eeae602d4da
    
    
  • # Avec echo

    Posté par  . Évalué à 1. Dernière modification le 08 janvier 2013 à 07:32.

    test=machaine!
    
    echo -e ${test:0:$((${#test}/2))}'\n'${test:$((${#test}/2)):${#test}}
    
    

    Le résultat :

    mach
    aine!
    
    

    Explications :

    test=machaine
    
    ${#test}     # Longueur de la chaine dans la variable 'test' (ici 8)
    $((2+3))     # Permet de faire des opérations dans bash
    ${test:2:3}  # Sélectionne une sous-chaine à partir du 2em caractère et de longueur 3 (ici on aura 'cha')
    
    

    EDIT: Toutes mes excuses, je n'avais pas lu les commentaires précédents, la solution de Shift est meilleure que la mienne.

  • # Avec bash et sed

    Posté par  . Évalué à 1.

    Salut,

    $ echo ${string}
    pe8e2bdd33ef4ddc8e603eeae602d4da
    
    $ sed -r 's/.{'$((${#string}/2))'}/&\n/' <<<${string}
    pe8e2bdd33ef4ddc
    8e603eeae602d4da
    
    

    ;-)

    • [^] # Re: Avec bash et sed

      Posté par  . Évalué à 1.

      Merci beaucoup, je ne m'attendais pas à voir autant de réponse en une nuit :)

      Je vais utiliser la solution avec le awk plus facile à utiliser entre deux pipe.

      Merci à vous.

      • [^] # Re: Avec bash et sed

        Posté par  (site web personnel) . Évalué à 3. Dernière modification le 08 janvier 2013 à 08:58.

        Pour info, en Bash avec pipe :

        echo qe8e2bdd33ef4ddc8e603eeae602d4dab | { read s; echo -e ${s:0:$((${#s}/2))}\\n${s:$((${#s}/2))}; }
        
        

        L'association LinuxFr ne saurait être tenue responsable des propos légalement repréhensibles ou faisant allusion à l'évêque de Rome, au chef de l'Église catholique romaine ou au chef temporel de l'État du Vatican et se trouvant dans ce commentaire

      • [^] # Re: Avec bash et sed

        Posté par  . Évalué à 2.

        Je vais utiliser la solution avec le awk plus facile à utiliser entre deux pipe.

        Y'en a qui ont la belle vie !

        Il se prend pour Napoléon, son état empire.

  • # Avec fold

    Posté par  . Évalué à 4.

    Tant qu'on y est:

    string=pe8e2bdd33ef4ddc8e603eeae602d4da
    echo $string | fold -w $((${#string}/2))
    
    
  • # Avec cut & wc

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

    Comme tout le monde donne une solution différente, juste en utilisant cut et wc:

    > STR="pe8e2bdd33ef4ddc8e603eeae602d4da"
    > echo $STR | cut -b 1-$(($(echo $STR | wc -c)/2) # première moitié
    pe8e2bdd33ef4ddc
    > echo $STR | cut -b $(($(echo $STR | wc -c)/2+1))- # seconde moitié
    8e603eeae602d4da
    
    
  • # Avec zsh

    Posté par  . Évalué à 3.

    On insère un LF au milieu, et on affiche:

    str[$#str/2]+='\n'
    print $str
    
    

    On peut aussi insérer un espace pour mettre directement dans un tableau :

    str[$#str/2]+=' '
    array=( ${(z)str} )
    print -l $array
    
    

    Assez bizarrement, je n'arrive pas à insérer un vrai LF dans le premier cas ; il s'agit toujours de la séquence \ puis n bien interprétée par le print mais pas par (f).

    • [^] # Re: Avec zsh

      Posté par  . Évalué à 1.

      Je suis comblé de réponses :)
      Merci à tous.

    • [^] # Re: Avec zsh

      Posté par  . Évalué à 2.

      J'ai finalement compris le problème : il faut utiliser $'\n' au lieu de '\n'.

Suivre le flux des commentaires

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