|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Nouveau Membre du Club
![]() Inscription : août 2011 Messages : 22 ![]() |
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. |
|
|
10
|
|
|
#2 |
|
Expert Confirmé Sénior
![]() Frédéric Ingénieur développement logiciels Inscription : février 2006 Messages : 3 055 ![]() |
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 |
|
|
01
|
|
|
#3 |
|
Nouveau Membre du Club
![]() Inscription : août 2011 Messages : 22 ![]() |
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. |
|
|
10
|
|
|
#4 |
|
Expert Confirmé
![]() Inscription : janvier 2011 Messages : 970 ![]() |
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. |
|
|
20
|
|
|
#5 |
|
Nouveau Membre du Club
![]() Inscription : août 2011 Messages : 22 ![]() |
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 ... |
|
|
10
|
|
|
#6 | ||
|
Expert Confirmé
![]() Inscription : janvier 2011 Messages : 970 ![]() |
Ok, c'est donc un peu plus complexe
Essaies ça : Code :
__________________
$ man woman Il n'y a pas de page de manuel pour woman. |
||
|
|
10
|
|
|
#7 |
|
Nouveau Membre du Club
![]() Inscription : août 2011 Messages : 22 ![]() |
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};' 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 ....
|
|
|
10
|
|
|
#8 | ||
|
Expert Confirmé
![]() Inscription : janvier 2011 Messages : 970 ![]() |
Code :
__________________
$ man woman Il n'y a pas de page de manuel pour woman. |
||
|
|
10
|
|
|
#9 |
|
Nouveau Membre du Club
![]() Inscription : août 2011 Messages : 22 ![]() |
Maintenant je vais m'interresser plus à sed qu'auparavant merci tu m'as donner l'envie
|
|
|
10
|
Copyright © 2000-2012 - www.developpez.com