IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

[sed] Boucle/branchement jusqu'à une ligne vide


Sujet :

Shell et commandes GNU

  1. #1
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 378
    Points
    19 378
    Par défaut [sed] Boucle/branchement jusqu'à une ligne vide
    Bonjour,

    avec un fichier tel que celui-ci, par exemple :
    toto le 1 janvier 2016
    3 pains
    5 bonbons

    toto le 1 fevrier 2016
    7 pains
    2 bonbons

    toto le 1 mars 2016
    8 pains
    3 orange

    titi le 1 decembre 2016
    2 pains
    5 bonbons

    toto le 1 avril 2016
    1 pains
    3 bonbons

    toto le 1 avril 2016
    1 pains
    3 bonbons
    je voudrais dans un premier temps ne retenir que les paragraphes comportant toto,
    mais je voudrais aussi ne retenir que les paragraphes comportant toto et bonbons.
    Donc, je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ sed -n '/toto/{:z;/^$/!{ N;bz};p}' toto.log

    au bout d'un moment, je me dis que sed ne vois pas de ligne vide (/^$/), et je remplace par deux alinéas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ sed -n '/toto/{:z;/\n\n/!{ N;bz};p}' toto.log
    et voilà le résultat :
    toto le 1 janvier 2016
    3 pains
    5 bonbons

    toto le 1 fevrier 2016
    toto le 1 mars 2016
    8 pains
    3 orange

    titi le 1 decembre 2016
    toto le 1 avril 2016
    1 pains
    3 bonbons

    toto le 1 avril 2016
    pas magnifique, n'est-ce pas !

    que se passe-t-il ?
    comment obtenir ce que je souhaite ?

    par avance merci.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  2. #2
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 277
    Points : 12 722
    Points
    12 722
    Par défaut
    Bonsoir N_BaH,

    Ici, on considère que la fin d'un paragraphe est une ligne vide ?
    Si c'est le cas, il y a un problème car il n'y en a pas...

    Sinon, selon ton exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    $ sed -n '/toto/,/^ *$/{H;/^ *$/bz;$!b;:z;x;s/^ *\n//;/bonbon/p;}' toto.log 
    toto le 1 janvier 2016
    3 pains
    5 bonbons
     
    toto le 1 fevrier 2016
    7 pains
    2 bonbons
     
    toto le 1 avril 2016
    1 pains
    3 bonbons
     
    toto le 1 avril 2016
    1 pains
    3 bonbons
    Mais si dans toto.log, on a par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    toto le 1 avril 2016
    1 pains
    3 bonbons
    titi le 1 mai 2016
    3 pains
    6 bonbons
    ça ne fonctionne plus...
    Cordialement.

  3. #3
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 378
    Points
    19 378
    Par défaut
    Citation Envoyé par disedorgue
    Ici, on considère que la fin d'un paragraphe est une ligne vide ?
    oui, c'est ça.
    Si c'est le cas, il y a un problème car il n'y en a pas...
    si, si, il y en a. je ne sais pas pourquoi, à la copie, a été ajouté un espace.
    je corrige mon premier message.

    EDIT: ah, non. c'est le formatage du forum qui ajoute un espace sur les lignes vides.

    je change la balise.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  4. #4
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 277
    Points : 12 722
    Points
    12 722
    Par défaut
    Pas grave, le sed que j'ai donné, fonctionne aussi... mais tu peux le modifier en supprimant les ' *'.
    Cordialement.

  5. #5
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 378
    Points
    19 378
    Par défaut
    ok, merci.

    je voudrais tout de même comprendre pourquoi il semble qu'il n'est pas possible d'ajouter la ligne suivante (avec N) à l'espace de travail (pattern space) jusqu'à une ligne vide.
    pourquoi la méthode que je voudrais utiliser ne fonctionne pas* ?
    car si je remplace la ligne vide (tant dans le texte que dans le sed) par un mot quelconque (fin par exemple), ça a l'air de fonctionner.

    * j'aurais dû préciser « comment obtenir ce que je souhaite avec cette méthode ? »
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  6. #6
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 277
    Points : 12 722
    Points
    12 722
    Par défaut
    Le premier cas que tu présente ne peut fonctionner, car puisque tu as trouvé "toto", ton pattern n'est pas vide... donc '/^$/' ne sera jamais trouvé.

    Le deuxième cas ne fonctionne pas car ce que tu veux trouver, c'est '\n' et une ligne vide et non pas 2 '\n' consécutif... suffit donc de remplacer '\n\n' par '\n$' pour que ça fonctionne.

    Bon après, faut que tu gères la fin de fichier...
    Cordialement.

  7. #7
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 378
    Points
    19 378
    Par défaut
    merci disedorgue.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  8. #8
    Expert éminent

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Points : 6 276
    Points
    6 276
    Par défaut
    Salut,
    Citation Envoyé par N_BaH Voir le message
    ok, merci.

    je voudrais tout de même comprendre pourquoi il semble qu'il n'est pas possible d'ajouter la ligne suivante (avec N) à l'espace de travail (pattern space) jusqu'à une ligne vide.
    C'est possible, mais pas avec cette méthode. Il faut vider l'espace de travail avant.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    $ sed -n '/toto/{h;:z;n;/^$/!{H;bz};H;g;/bonbon/p}' fich 
    toto le 1 janvier 2016
    3 pains
    5 bonbons
     
    toto le 1 fevrier 2016
    7 pains
    2 bonbons
     
    toto le 1 avril 2016
    1 pains
    3 bonbons
     
    toto le 1 avril 2016
    1 pains
    3 bonbons
    $ man woman
    Il n'y a pas de page de manuel pour woman.

  9. #9
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 378
    Points
    19 378
    Par défaut


    merci
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2010] Boucle jusqu'à une ligne vide
    Par Sophie85 dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 29/05/2013, 12h45
  2. Réponses: 2
    Dernier message: 20/07/2006, 19h40
  3. [VBA-E] Inserer une ligne vide dans Excel
    Par monsurf dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 12/07/2006, 16h48
  4. Rechercher une ligne vide
    Par nico-pyright(c) dans le forum Traitement d'images
    Réponses: 7
    Dernier message: 22/12/2005, 17h10
  5. TValueListEditor: Ajout automatique d'une ligne vide
    Par Patrick Seuret dans le forum C++Builder
    Réponses: 3
    Dernier message: 24/06/2005, 12h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo