Forum Linux.débutant Sed

Posté par  . Licence CC By‑SA.
Étiquettes : aucune
-27
17
avr.
2018

Bonjour,

Je cherche une expression régulière avec la commande sed pour transformer la chaine suivante :

2018;16;15;c;1;2;3 en 2018;16;15;c 1 2 3

par avance merci

  • # C'est le genre de question qu'il faut poser en forum…

    Posté par  . Évalué à 7.

    Ceci étant dit, il y a plusieurs façon de faire. Par exemple :

    s/c;1;2;3/c 1 2 3/
    

    (Comme tu parles d'une chaîne spécifique, je donne une solution spécifique)

  • # Sed

    Posté par  . Évalué à -5.

    merci pour ton retour mais j ai juste donné un exemple le c peut etre suivi des nombre d'un ou plusieurs chiffres exemple c;20191;6;53534;67777…

  • # Facile

    Posté par  . Évalué à 5.

    $ echo "2018;16;15;c;1;2;3" | sed s/2018\;16\;15\;c\;1\;2\;3/2018\;16\;15\;c\ 1\ 2\ 3/g
    2018;16;15;c 1 2 3

    De rien.

  • # SED

    Posté par  . Évalué à -5.

    la chaine peut evoluer c'est pas fixe c;1;2;3 paut etre dans un autre cas c,201771;53535;3;5

    je veux une solution qui marche pour tous les cas.

    merci

    • [^] # Re: SED

      Posté par  . Évalué à 9.

      Moi je veux un million de dollars !

      • [^] # Re: SED

        Posté par  . Évalué à -1.

        Tu l'auras en betcoins :)

        • [^] # Re: SED

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

          Compte créé le 17/04/2018…

          Cela sent l'exercice ton truc…

          Je dirais qu'il faut utiliser les () pour choper les nombres. Très facile à faire en Perl et en sed puisque presque pareil dans ce cas là.

          • [^] # Re: SED

            Posté par  . Évalué à 2.

            J'avais commencé à faire une réponse plus générique, mais comme effectivement la question sentait l'exercice (et avec le recul, au vu des questions supplémentaires qui ressemblent plus à des exigences), j'ai préféré donner une solution « littérale » pour la chaîne donnée.

  • # Solution

    Posté par  . Évalué à 10.

    ... | sed 's/;/ /4g'

    J'aurai appris un truc sur sed au passage. Cool. :) Le switch "g" précise de remplacer toutes les occurrences de ";" par des " " mais on peut moduler le g et ici le "4g" signifie "à partir de la 4ème occurrence du motif". J'étais parti sur un équivalent en perl mais qui faisait plusieurs lignes…

  • # Pourquoi seulement sed ?

    Posté par  . Évalué à 1. Dernière modification le 17 avril 2018 à 14:02.

    C'est possible à faire en sed, mais ce sera avec une regex usine à gaz. La logique voudrait que tu splittes la chaîne en 2 autour de la chaîne ;c; avec un outil de ton choix (cut, awk ou en bash pur), puis que t'appliques un "sed 's/\;/ /g'" bête et méchant sur la partie de droite.

    Alors oui, je pourrais te pondre la regex horrible qui marche direct avec sed, mais hormis un exercice de style j'ai du mal à voir l'intérêt.

    • [^] # Re: Pourquoi seulement sed ?

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

      Non le pb n'est pas compliqué donc ce n'est pas une regex horrible ;-)

      À noter en passant que Perl5 permet de mettre des espaces et des commentaires dans les regex et que Perl6 ré-invente les regex en repartant d'une copie vierge.

  • # Le tuto de la mort en français

    Posté par  . Évalué à 3. Dernière modification le 17 avril 2018 à 16:33.

    Un lien vers l'explication que tu cherches

    http://www.funix.org/fr/unix/expr-sed.htm

    Donne un poisson à un homme tu le nourriras un jours ; apprend lui à pêcher tu le nourriras toute sa vie.

  • # hum

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

    La longueur du début est-elle fixe ?
    Peux tu transformer ton exemple en regex ([0-9]{4};[0-9]{2};[0-9]{2};[a-z]….) ?
    Bref donne nous une pseudo analyse du format en entrée plutôt qu'un seul exemple.

    Is it a Bird? Is it a Plane?? No, it's Super Poil !!!

Suivre le flux des commentaires

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