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 :

Boucle commande sed


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Septembre 2009
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 63
    Par défaut Boucle commande sed
    Bonjour à tous,

    j'ai utilisé la commande sed pour récupérer à partir d'un fichier, les champs entre les balises <DOCNO> et </DOCNO> si le motif1 existe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -n '/<DOCNO>/{:z;N;/<\/DOCNO>/!b z;/motif1/p}' fichier.txt
    Résultat:
    <DOCNO>
    .....
    motif1
    .....
    </DoCNO>
    Je dois faire ce même traitement pour plusieurs motifs, donc j'ai mis tous les motifs dans un fichier motifs.txt et en utilisant une boucle, j'ai essayé:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for i in $(cat motifs.txt); do sed -n '/<DOCNO>/{:z;N;/<\/DOCNO>/!b z;/"$i"/p}' fichier.txt ;done
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cat motifs.txt |while read ligne; do sed -n '/<DOCNO>/{:z;N;/<\/DOCNO>/!b z;/"$ligne"/p}' fichier.txt; done
    Le résultat est vide, je ne sais pas comment faire la boucle correctement. Pourriez vous m'aidez svp. Merci à l'avance.

  2. #2
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 349
    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 349
    Par défaut
    Bonjour,

    En fait ton souci est situé sur le simple quote qui protège ta commande sed.
    Donc une façon rapide (pas la mieux, car on peut vite se perdre) pour résoudre par exemple ta commande avec la boucle for:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for i in $(cat motifs.txt); do sed -n '/<DOCNO>/{:z;N;/<\/DOCNO>/!b z;/'"$i"'/p}' fichier.txt ;done
    C'est le même souci dans la deuxieme.

  3. #3
    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,

    Puisque le traitement a lieu sur le même fichier, pourquoi ne pas regrouper tous les motifs recherchés avec un OU dans le motif de recherche ?

    Le fichier de départ :
    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
    $ cat plop 
    <DOCNO>
    .....
    motif1
    .....
    </DoCNO> 
    <TOTO>
    .....
    motif1
    .....
    </TOTO>
    <DOCNO>
    .....
    motif2
    .....
    </DoCNO>
    <TOTO>
    .....
    motif2
    .....
    </TOTO>
    <DOCNO>
    .....
    motifA
    .....
    </DoCNO> 
    <TOTO>
    .....
    motif3
    .....
    </TOTO>
     <DOCNO>
    .....
    motif3
    .....
    </DoCNO> 
    <TOTO>
    .....
    motif4
    .....
    </TOTO>
    <DOCNO>
    .....
    motifB
    .....
    </DoCNO>
    Le fichier de motif :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ cat fic 
    motif1
    motif2
    motif3
    Variable de mise en forme du motif :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ motif=$(sed ':z;N;$!bz;s/\n/\\|/g' fic)
     
    $ echo "${motif}"
    motif1\|motif2\|motif3
    La syntaxe pour sed :
    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 '\#<DOCNO>#{:z;N;\#</DoCNO>#!bz;/'"${motif}"'/p}' plop 
    <DOCNO>
    .....
    motif1
    .....
    </DoCNO> 
    <DOCNO>
    .....
    motif2
    .....
    </DoCNO>
     <DOCNO>
    .....
    motif3
    .....
    </DoCNO>

  4. #4
    Membre confirmé
    Inscrit en
    Septembre 2009
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 63
    Par défaut
    Vraiment merci disedorgue et zipe31 pour vos réponses

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

Discussions similaires

  1. La commande sed renvoie un fichier vide
    Par aaronw dans le forum Shell et commandes GNU
    Réponses: 1
    Dernier message: 29/09/2006, 11h46
  2. Problème avec la commande sed
    Par JUSTIN Loïc dans le forum Linux
    Réponses: 2
    Dernier message: 05/09/2006, 10h17
  3. Aide sur les commandes sed et awk
    Par elkhy dans le forum Shell et commandes GNU
    Réponses: 6
    Dernier message: 20/06/2006, 08h22
  4. La commande sed
    Par ajsd0208 dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 26/04/2006, 14h34
  5. Commande SED
    Par pierregag dans le forum Shell et commandes GNU
    Réponses: 1
    Dernier message: 17/03/2006, 12h51

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