Précédent   Forum des professionnels en informatique > Systèmes > Linux > Applications > Shell
Shell Vos questions sur l'utilisation des commandes shell
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 01/08/2011, 16h41   #1
Nouveau Membre du Club
 
Femme
Inscription : août 2011
Messages : 22
Détails du profil
Informations personnelles :
Sexe : Femme

Informations forums :
Inscription : août 2011
Messages : 22
Points : 29
Points : 29
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.
erustika est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 01/08/2011, 21h51   #2
Expert Confirmé Sénior
 
Avatar de Sve@r
 
Homme Frédéric
Ingénieur développement logiciels
Inscription : février 2006
Messages : 3 055
Détails du profil
Informations personnelles :
Nom : Homme Frédéric
Âge : 44
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 : 3 055
Points : 4 934
Points : 4 934
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...
__________________
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Tout ce qu'un individu reçoit sans rien faire pour l'obtenir, un autre individu a dû travailler pour le produire sans en tirer profit.
Tout Pouvoir ne peut distribuer aux uns que ce qu'il a préalablement confisqué à d'autres car on n'accroît pas les biens en les divisant.
Quand la moitié d'un peuple croit qu'il ne sert à rien de faire des efforts car l'autre moitié les fera pour elle, et quand cette dernière moitié se dit qu'il ne sert à rien d'en faire car ils bénéficieront à d'autres, cela s'appelle le déclin et la fin d'une nation.
Dr. Adrian Rogers, 1931
Sve@r est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 02/08/2011, 10h40   #3
Nouveau Membre du Club
 
Femme
Inscription : août 2011
Messages : 22
Détails du profil
Informations personnelles :
Sexe : Femme

Informations forums :
Inscription : août 2011
Messages : 22
Points : 29
Points : 29
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.
erustika est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 02/08/2011, 11h10   #4
Expert Confirmé
 
Inscription : janvier 2011
Messages : 970
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : janvier 2011
Messages : 970
Points : 2 871
Points : 2 871
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 ?
__________________
$ man woman
Il n'y a pas de page de manuel pour woman.
zipe31 est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 02/08/2011, 12h57   #5
Nouveau Membre du Club
 
Femme
Inscription : août 2011
Messages : 22
Détails du profil
Informations personnelles :
Sexe : Femme

Informations forums :
Inscription : août 2011
Messages : 22
Points : 29
Points : 29
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

...
erustika est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 02/08/2011, 13h19   #6
Expert Confirmé
 
Inscription : janvier 2011
Messages : 970
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : janvier 2011
Messages : 970
Points : 2 871
Points : 2 871
Ok, c'est donc un peu plus complexe

Essaies ça :

Code :
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

$
__________________
$ man woman
Il n'y a pas de page de manuel pour woman.
zipe31 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 02/08/2011, 15h21   #7
Nouveau Membre du Club
 
Femme
Inscription : août 2011
Messages : 22
Détails du profil
Informations personnelles :
Sexe : Femme

Informations forums :
Inscription : août 2011
Messages : 22
Points : 29
Points : 29
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 :
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 ....

erustika est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 02/08/2011, 15h28   #8
Expert Confirmé
 
Inscription : janvier 2011
Messages : 970
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : janvier 2011
Messages : 970
Points : 2 871
Points : 2 871
Code :
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"
__________________
$ man woman
Il n'y a pas de page de manuel pour woman.
zipe31 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 02/08/2011, 15h31   #9
Nouveau Membre du Club
 
Femme
Inscription : août 2011
Messages : 22
Détails du profil
Informations personnelles :
Sexe : Femme

Informations forums :
Inscription : août 2011
Messages : 22
Points : 29
Points : 29
Maintenant je vais m'interresser plus à sed qu'auparavant merci tu m'as donner l'envie
erustika est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 10h04.


 
 
 
 
Partenaires

Hébergement Web