• [^] # Re: pourtant

    Posté par . En réponse au message inserer un espace dans une sortie de 'cut'. Évalué à 8.

    bon, on peut dégainer du sed alors, mais ça va pas être très lisible ...
    Par exemple, pour les intervalles de ta question de départ ("22-25,47-55,56-64")

    $ echo 1234567890abcdefghijABCDEFGHIJ1234567890abcdefghijABCDEFGHIJ1234567890 |cut -c"22-25,47-55,56-64"
    BCDEghijABCDEFGHIJ1234


    D'après ton propre aveu, tu n'es pas une grosse brute en sed, on va donc construire la commande pas à pas. Tu peux aller te faire peur en allant direct à la fin du commentaire, mais une fois que tu auras lu ce petit pavé, ça devrait être claire comme de l'eau à peine croupie ;)

    On va utiliser sed suivant la syntaxe suivante :
    sed -e 's/<pattern>/<replacement>/'
    qui permet d'appliquer une regex. Dans cette regex, il faut définir un motif capable de représenter les découpes qu'on veut faire dans la ligne de départ.

    rapidement :
    ^ symbolise le début de ligne
    . remplace une occurence d'un caractère quelconque
    { et } permettent de "compter" des motifs
    ( et ) permettent d'extraire les bouts de lignes pour les réutiliser dans la chaîne de remplacement.
    * match n occurences du motif qu'il suit.

    Pour le motif de recherche, on peut construire quelque chose comme:
    ^.{21}(.{4}).{21}(.{9})(.{9}).*
    le .* à la fin représente la fin de la ligne (tous les caractères entre la position 65 et la fin de ligne)

    Pour la chaîne de remplacement, c'est beaucoup plus simple. On va utiliser une série de chiffres représentant le numéro du motif entre parenthèse de la chaîne de recherche. Autrement dit, 1 va correspondre au groupe de 4 caractère, 2, au premier groupe de 9 et 3 au second groupe de 9.

    on aura quelquechose comme :
    sed -e 's/^.{21}(.{4}).{21}(.{9})(.{9}).*/1 2 3/'

    sauf que j'ai légèrement simplifié. Les chiffres représentants les blocs entre parenthèses dans le motif de remplacement doivent être échappés par un \, sinon, ils représentent simplement des chiffres.
    sed -e 's/^.{21}(.{4}).{21}(.{9})(.{9}).*/1円 2円 3円/'

    et même qu'en fait, j'avais beaucoup simplifié, parce qu'il faut aussi échapper les accolades et les parenthèses, et d'un seul coup, c'est le bordel :

    $ echo 1234567890abcdefghijABCDEFGHIJ1234567890abcdefghijABCDEFGHIJ1234567890 | sed -e 's/^.\{21\}\(.\{4\}\).\{21\}\(.\{9\}\)\(.\{9\}\).*/1円 2円 3円/'
    BCDE ghijABCDE FGHIJ1234


    bref, sur le principe, pas très compliqué de faire ça en sed, mais pas très lisible ...
    Je dirais même que ça doit être plus lisible avec un one liner en perl :D

    bon, ça n'explique pas pourquoi ton cut n'applique pas l'ouput delimiter.