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 :

Identifier les messages supprimés en sortie d'un diff


Sujet :

Shell et commandes GNU

  1. #1
    Membre averti
    Femme Profil pro
    Inscrit en
    Août 2011
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 32
    Par défaut Identifier les messages supprimés en sortie d'un diff
    Bonjour,

    Je souhaite exposer mon problème à la suite de ce sujet car c'est sur la même commande de sed que je rencontre un problème.

    Je cherche à ressortir les enregistrements qui sont supprimés dans un fichier issu d'un diff.

    Le fichier en sorti de comparasion du diff sort les informations suivantes:

    3,4c3,4
    < enreg1
    < enreg2
    --
    > enreg3
    > enreg4
    208938d208876
    < enreg14
    208941d208878
    < enreg18
    208945d208881
    < enreg20
    208429,208431d208393
    < enreg998
    < enreg999
    < enreg1000

    Je ne veux conserver dans ce fichier diff uniquement les intervalles qui concernent d avec ses enregistrements <


    pour cela j'utilise la recherche de sed par intervalle:

    sed -n '/d/,/^[0-9]/p' diff > diffresd

    Cela récupère bien les intervalles avec d sauf lorsque le motif de fin contient d

    208938d208876
    < enreg998
    208941d208878
    208945d208881
    < enreg1000

    dans ce mode sed ne reprend pas le motif de fin comme motif de début.

    Du coup sed ne récupère pas les enregistrements

    208941d208878
    <... -> pas récupéré
    <... -> pas récupéré
    208945d208881

    J'ai cherché dans le man mais je n'ai pas trouvé d'option pour ce type de sed, avez-vous une astuce, car je dois pas être loin de la solution.

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 827
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 827
    Billets dans le blog
    1
    Par défaut
    Désolé, j'ai rien pigé à ton problème. Tu parles de "motif de fin comme motif de début", tu donnes 2 exemples identiques mais (semble-t-il), l'un fonctionne mais pas l'autre...

    Je te dirais donc que si tu veux extraire des infos d'un fichier, grep est plus approprié que sed...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Membre averti
    Femme Profil pro
    Inscrit en
    Août 2011
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 32
    Par défaut
    Je vais essayer d'être plus clair:

    Je reprends la structure de mon fichier

    3,4c3,4
    < enreg1
    < enreg2
    --
    > enreg3
    > enreg4

    208938d208876
    < enreg14
    208941d208878
    < enreg18
    208945d208881
    < enreg20
    208429,208431d208393
    < enreg998
    < enreg999
    < enreg1000


    Ce fichier est le résultat d'un diff dont je souhaite isoler les enregistrements qui sont issu d'un type de différence (d ou a ou c), ici je veux récupérer


    208938d208876
    < enreg14
    208941d208878
    < enreg18
    208945d208881
    < enreg20
    208429,208431d208393
    < enreg998
    < enreg999
    < enreg1000
    et ne pas récupérer

    3,4c3,4
    < enreg1
    < enreg2
    --
    > enreg3
    > enreg4


    Je pensais le faire par sed, car il permet de définir un intervalle avec un motif de sélection de ligne de début, et un motif de sélection de ligne de fin.

    motif de début = [les lignes qui contiennent d]
    motif de fin =[les lignes commençant par un chiffre]

    ce qui me permet de récupérer ses intervalles:

    208938d208876
    < enreg14
    208941c208878

    ou

    208938d208876
    < enreg14
    208941a208878


    Le problème se pose lorsque le motif de fin doit être aussi considéré comme motif de début (c'est à dire que la ligne considéré comme motif de fin (commence par un chiffre, et contient la lettre d)

    208938d208876
    < enreg14
    208941d208878
    209944d209999

    < enreg18
    208941d208878

    Les enregistrements contenu entre les lignes en gras ne sont pas récupéré:


    208941d208878
    < enreg15
    < enreg16
    209944d209999



    avec un grep je ne vois pas trop comment faire c'est pour cela que je me suis orienté vers sed qui permet de définir un intervalle donné avec

    début intervalle = motif de début
    fin intervalle = motif de fin

    comment faire un grep pour dire: prend tous les enregistrements qui contiennent la lettre 'd et' contiennent '<' (avec les enregistrements < qui correspondent à l'enregistrement recherché:

    208941d208878
    < enreg15
    < enreg16


    En espérant avoir été plus clair cette fois-ci.

  4. #4
    Expert confirmé

    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
    Par défaut
    Salut,

    En clair et en gros il faut juste éliminer les premières lignes jusqu'au premier motif comprenant un "d" ?

    Ou c'est plus complexe que ça ?

  5. #5
    Membre averti
    Femme Profil pro
    Inscrit en
    Août 2011
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 32
    Par défaut
    Alors c'est presque ça, je vais donner un exemple plus parlant avec en bleu ce qu'il faut garder:

    3,4c3,4 -------------> contient c donc on ne garde pas
    < enreg1
    < enreg2
    --
    > enreg3
    > enreg4
    20d208 -------------------> Intervalle de début contient car contient d
    < enreg14
    21d209
    < enreg18
    22d210
    < enreg20
    23,25d21
    < enreg998
    < enreg999
    < enreg1000 --------------> Intervalle de fin

    10,11c30,31 ---------------------> contient c donc on ne garde pas
    < enreg1
    < enreg2
    --
    > enreg3
    > enreg4
    40,41a51,52 -----------> contient a donc on ne garde pas
    > enreg3
    > enreg4
    42d54 ------------------> Intervalle de début car contient d
    < enreg14
    55d56
    < enreg18 ----------------> Intervalle de fin

    60a61,62 -------------> contient a donc on ne garde pas
    > enreg3
    > enreg4
    10,11c30,31 -----------> contient c donc on ne garde pas
    < enreg1
    < enreg2
    --
    > enreg3
    > enreg4

    ...

  6. #6
    Expert confirmé

    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
    Par défaut
    Ok, c'est donc un peu plus complexe

    Essaies ça :

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    $ cat plop 
    3,4c3,4 -------------> contient c Donc on ne garDe pas
    < enreg1
    < enreg2
    --
    > enreg3
    > enreg4
    20d208 -------------------> Intervalle de début contient car contient d
    < enreg14
    21d209
    < enreg18
    22d210
    < enreg20
    23,25d21
    < enreg998
    < enreg999
    < enreg1000 --------------> Intervalle De fin
    10,11c30,31 ---------------------> contient c Donc on ne garDe pas
    < enreg1
    < enreg2
    --
    > enreg3
    > enreg4
    40,41a51,52 -----------> contient a Donc on ne garDe pas
    > enreg3
    > enreg4
    42d54 ------------------> Intervalle de début car contient d
    < enreg14
    55d56
    < enreg18 ----------------> Intervalle De fin
    60a61,62 -------------> contient a Donc on ne garDe pas
    > enreg3
    > enreg4
    10,11c30,31 -----------> contient c Donc on ne garDe pas
    < enreg1
    < enreg2
    --
    > enreg3
    > enreg4
    
    $ sed -n ':a;/d/{h;:z;n;/^</{H;bz};x;p;g;ba};' plop 
    20d208 -------------------> Intervalle de début contient car contient d
    < enreg14
    21d209
    < enreg18
    22d210
    < enreg20
    23,25d21
    < enreg998
    < enreg999
    < enreg1000 --------------> Intervalle De fin
    42d54 ------------------> Intervalle de début car contient d
    < enreg14
    55d56
    < enreg18 ----------------> Intervalle De fin
    
    $

  7. #7
    Membre averti
    Femme Profil pro
    Inscrit en
    Août 2011
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 32
    Par défaut
    Génial!

    Merci Zipe31!!!

    Cela réalise exactement ce que je veux

    Cela marche aussi très bien en remplaçant /d/ par /a/ ou /c/ pour récupérer ceux qui concerne a ou c

    Si cela ne te dérange pas pour pouvoir la réutiliser pour d'autres motifs j'aimerais savoir comment elle fonctionne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -n ':a;/d/{h;:z;n;/^</{H;bz};x;p;g;ba};'
    le /^</ c'est pour récupérer ce qui se trouve sous les lignes contenant le motif /d/

    Les options (je suppose)

    h;:zn; et {H;bz};x;p;g;ba permettent de conserver les enregistrements qui commencent par < ?

    edit: bon j'arrête avec une question ....


  8. #8
    Expert confirmé

    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
    Par défaut
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    #n
    Affichage à la demande (voir flag "p" plus loin)
    
    :a
    Étiquette pour branchement
    
    /d/ {
    Si le motif "d" est trouvé, exécuter les commandes entre accolades
    
        h
        On place la ligne dans la mémoire secondaire (en écrasant le contenu)
    
        :z
        Nouvelle étiquette de branchement
    
        n
        On passe à la ligne suivante en vidant l'espace de travail
    
        /^</ {
        Si le motif "/^>/" est trouvé, exécuter les commandes entre accolades
    
            H
    	On ajoute la ligne à la mémoire secondaire (on concatène)
    
            b z
    	Puis on se branche à l'étiquette "z"
    
        }
        Fin des instructions pour le motif "/^>/"
    
        x
        On échange le contenu des mémoires (principale et secondaire)
    
        p
        On affiche le contenu de la mémoire principale sur la sortie standard
    
        g
        On récupère le contenu de la mémoire secondaire en écrasant celui da la mémoire principale
    
        b a
        Et on se branche à l'étiquette "a"
    
    }
    Fin des instructions pour le motif "d"

  9. #9
    Membre averti
    Femme Profil pro
    Inscrit en
    Août 2011
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 32
    Par défaut
    Maintenant je vais m'interresser plus à sed qu'auparavant merci tu m'as donner l'envie

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

Discussions similaires

  1. Supprimer les messages lors de l'exe d'une macro
    Par kluh dans le forum Access
    Réponses: 2
    Dernier message: 01/12/2005, 22h00

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