Forum Programmation.shell Pour les pros de SED

Posté par  .
Étiquettes : aucune
0
27
jan.
2005
Bonjour ,

Je souhaite supprimer des lignes qui commencent toutes par une même série dont je ne connais pas la longueur dans un fichier.

Ex de fichier où je veux par exemple supprimer les lignes 000123:

0001234893459847594387534985
000124345873498732498723492
000123DFGK343908234098
000124ER3247349873498732948734989

Il faut faire un truc du genre:

cat file1 | sed "/s/000123???????????" >> file2

Quelqu'un à une idée ?

Merci d'avance
  • # grep ?

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

    grep -v '^000123' devrait te convenir si j'ai compris la question
    • [^] # Re: grep ?

      Posté par  . Évalué à 0.

      non pas vraiment car dans mon fichier j'ai aussi des ligne autre que 000123 que je veux garder et dans l'ordre

      Ex bis

      000123DFDFSS
      000124DFKJFDGJKFGLKJ
      000125DSFLKJDFLKJSDFLKSD
      000125FDKLJDFSKJ
      000123SDLKJDLKDF
      000123SDLKJSDFLKJDF
      000100438743587239832798734
      000124ZEIUERIUZERIUEZMRZE

      J'ai peut-être une quinzaine de type de ligne differente et c'est par exemple que les 000123 que je veux supprimer

      C'est effectivement plus claire expliqué comme ça ?
      • [^] # Re: grep ?

        Posté par  . Évalué à 2.

        Expliqué comme ça, ça ne change rien ! La première réponse me semble toujours aussi bonne. Tu l'as essayée ?
        • [^] # Re: grep ?

          Posté par  . Évalué à 2.

          $ cat >fictmp
          000123DFDFSS
          000124DFKJFDGJKFGLKJ
          000125DSFLKJDFLKJSDFLKSD
          000125FDKLJDFSKJ
          000123SDLKJDLKDF
          000123SDLKJSDFLKJDF
          000100438743587239832798734
          000124ZEIUERIUZERIUEZMRZE
          $ grep -v '^000123' fictmp
          000124DFKJFDGJKFGLKJ
          000125DSFLKJDFLKJSDFLKSD
          000125FDKLJDFSKJ
          000100438743587239832798734
          000124ZEIUERIUZERIUEZMRZE
          $

          c'est pas ça que tu veux ?
        • [^] # Re: grep ?

          Posté par  . Évalué à -4.

          non mais avec un grep je vais récupérer les lignes que je veux supprimer,

          si je fais un

          grep ^000123 file1

          ca va me donner n truc du genre:

          000123..................
          000123..................
          000123..................
          000123..................
          000123..................

          moi je veux avoir toutes les lignes sauf les 000123

          je ne pense pas que grep puisse le faire où alors c'est du genre

          cat file1 | grep ^000124 && grep ^000100 && ...... Et je suis pas sûr que ça marche
          • [^] # Re: grep ?

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

            J'ai mis un -v.
            Cette option lui dit de sélectionner les lignes qui ne correspondent pas au lieu de celles qui correspondent :-)
      • [^] # Re: grep ?

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

        idem l'exemple de pascal me paraît bon :

        t'as essayé :
        cat file1 | grep -v '^000123'


        et si ça marche :

        cat file1 | grep -v '^000123' >> file2


        M.
        • [^] # Re: grep ?

          Posté par  . Évalué à 3.

          super je ne connaissant pas la négation avec grep

          C'est au poil ton truc Merci pascal & kolter

          Désolé d'avoir douté

          Bonne soirée
          pb résolu
        • [^] # Re: grep ?

          Posté par  . Évalué à 2.

          oh, un "Useless Use of cat" !

          grep -v '^000123' file1 > file2
          est suffisant.
  • # Et en sed...

    Posté par  . Évalué à 4.

    Juste pour complèter la culture de l'auteur de ce journal, en sed ça aurait donné ça : # sed '/^000123/d' file1 > file2 (c'est à dire que tu sélectionnes les ligne commençant par 000123, et tu leurs appliques la commande de suppression, "d")
    • [^] # Re: Et en sed...

      Posté par  . Évalué à 1.

      effectvement c'était simple, moi je pensais à une substitution par des ligne vide .

      Je suis pas trop doué, en shell :-)))))

      Par ailleur ça aurrait marché le : cat file1 | grep 000124 && grep 000100 ??

      (Pas de unix sous la main ce soir pour tester)
      • [^] # Re: Et en sed...

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

        plutôt : cat file1 | grep '^000124\|^000100'

        M.
        • [^] # Re: Et en sed...

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

          Rhaaaaaaa!
          Mais arrêtez de faire des "cat file | grep blabla" !
          grep ça peut lire sur stdin mais pitié, ça peut aussi lire dans un fichier avec "grep blabla file" !
          • [^] # Re: Et en sed...

            Posté par  . Évalué à 4.

            > ça peut aussi lire dans un fichier avec "grep blabla file"

            Et quand bien même ça ne pourrait pas, le "<" est fait juste pour ça...
      • [^] # Re: Et en sed...

        Posté par  . Évalué à 3.

        non, ça aurait pas marché :)
        mais que fait donc cette ligne me diras-tu ?
        alors, bon:
        && est un opérateur séparant deux commandes. Ca fonctionne comme ça:
        Si la première commande réussit, le shell lance la seconde, sinon, il la lance pas. Il n'y a donc aucun échange de donnée entre "cat file1 | grep 000124" et "grep 000100"

        en reprenant la commande en "pas à pas", ça donne:
        le shell lance cat sur le fichier et redirige la sortie standard de cat vers grep qui fait son sale boulot. Donc, quand on arrive au &&, il n'y a déjà plus que les lignes avec 000124 du fichier de départ.
        Ensuite, ça dépend de ce que contenait ton fichier.
        Si 000124 est effectivement présent dans ton fichier, le grep réussit, et le shell lance la commande grep 000100. Comme il n'y a pas de donnée en entrée pour grep dans cette seconde commande, grep se met en attente sur l'entrée standard.
        Si 000124 n'est pas présent dans ton fichier, le premier grep renvoie 1, donc le shell ne lance pas la seconde commande et c'est fini.

        par contre, on peut utiliser "ou" dans les expressions régulières
        un truc comme
        $ cat file1 | grep '000124\|000100'
        ça aurait marché.

        aussi, je me rend compte que ça a pas été explicitement dit dans les réponses, mais tu peux te dispenser du cat
        $ grep '000124\|000100' file
        donne le même résultat, tout en économisant un appel à cat.

        bon, je fais en partie doublon avec la réponse de kolter, mais le commentaire de texte, ça prend du temps ;-)
        juste oui, on peut rajouter les débuts de ligne (^) dans la regex
        • [^] # Re: Et en sed...

          Posté par  . Évalué à 3.

          une dernière petite remarque rapide sur > et >>
          attention: > écrase le fichier alors que >> ajoute à la fin
        • [^] # Re: Et en sed...

          Posté par  . Évalué à 4.

          > tu peux te dispenser du cat
          > $ grep '000124\|000100' file

          Ce qui me rappelle une discussion récente ici même :
          http://linuxfr.org/comments/516200.html#516200(...)
          • [^] # Re: Et en sed...

            Posté par  . Évalué à 2.

            oui, c'est bien aussi de lire les messages en entier avant d'y répondre :)
            • [^] # Re: Et en sed...

              Posté par  . Évalué à 2.

              mouarf, dsl, je vais commencé par m'appliquer mon propre commentaire à moi meme .. :/
  • # Merci

    Posté par  . Évalué à 0.

    Merci à tous ça marche au poil maintenant.

Suivre le flux des commentaires

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