Sélectionner un intervalle de ligne entre motif1 et 6ième occure

Résolu
Dan_NB Messages postés 9 Statut Membre -  
Dan_NB Messages postés 9 Statut Membre -
Bonjour,

Je dois modifier l'output d'un programme qui assez volumineux pour pouvoir lire les données qui m'intéresse plus facilement. Il s'agit d'un fichier texte que je manipule à l'aide d'un scriptshell (commande bash).

Etant donné que c'est un projet pour un stage, je n'ai pas beaucoup de temps pour me familiariser complémentent avec les regexp. C'est pourquoi je faits appels à vous ! =p

1) J'aimerais sélectionner une partie du document qui se trouve entre 2 motifs (motif1 et motif2). Mais j'aimerais que le code prenne en considération la 6ième occurrence du motif2. Exemple si on coupe à la 2ième occurence de motif2 (2ième occurenc epour avoir un exemple claire) :

motif1
blabla
motif2
blabla
motif2
bla
motif2
bla
motif2
bla
motif2
blabla

Deviendrait :

motif1
blabla
motif2
blabla
motif2

Mon idée serait d'utiliser la commande sed :
sed -i '/motif1/motif2/!d'  nom_fichier 

Comment la modifer pour que qu'elle prenne la 6ième occurence de motif 2 et non la première ?

Merci d'avance pour votre aide !

3 réponses

  1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 502
     
    Salut,

    pour avoir un exemple claire
    T'aurais au moins pu t'appliquer et donner un exemple beaucoup plus concret et non faire un copier/coller à la va vite de ton post sur Developpez ;-\

    Essaye ça :

    $ cat  plop
    motif1
    blabla
    motif2
    blabla
    motif2
    bla
    motif2
    bla
    motif2
    bla
    motif2
    blabla 
    
    $ sed -n ':z;N;$!bz;s/motif2/&\n/2M;s/\n\n.*//p' plop 
    motif1
    blabla
    motif2
    blabla
    motif2


    Je te laisse adapter ;-))

    PS. Et si la solution te convient, n'oublie pas d'aller aussi sur Developpez pour en rendre compte.

    0
  2. Dan_NB Messages postés 9 Statut Membre
     
    Re-salut,

    Je suis bien conscient que mon exemple est pas top (et désolé pour ca) mais mon application est bcp trop grosse pour être présenté ici.

    Je suis un total débutant en regexp, j'ai dû m'y mettre il y a 2 jours pour un stage. Je suis donc assez vite perdu ac des commande comme :
    sed -n ':z;N;$!bz;s/motif2/&\n/2M;s/\n\n.*//p' plop 
    .
    Parcontre je vois qu'elle ne fait pas intervenir /motif1/. Or j'aimerais "capturer" le texte qui se trouve entre /motif1/ et la 6ième occurence de /motif2/. Exemple plus "concret" :

    motif 1 = John
    motif2 = Kevin

    $ cat document.txt
    123
    456
    jjjjjjjjjjjjjjjj
    John
    455
    Kevin
    4444
    Kevin
    ssssssss
    kevin
    pppppp
    kevin
    mmmmmm
    kevin
    sdffdsdss
    kevin
    pppppprprpr
    lmdfldf
    sdl
    kevin
    $ sed "commande magique"
    $ cat document.txt
    John
    455
    Kevin
    4444
    Kevin
    ssssssss
    kevin
    pppppp
    kevin
    mmmmmm
    kevin
    sdffdsdss
    kevin

    Désolé pour le long post et pour ne pas être capable d'adpaté ta commande :s
    0
  3. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 502
     
    $ cat bar 
    123
    456
    jjjjjjjjjjjjjjjj
    John
    455
    Kevin
    4444
    Kevin
    ssssssss
    kevin
    pppppp
    kevin
    mmmmmm
    kevin
    sdffdsdss
    kevin
    pppppprprpr
    lmdfldf
    sdl
    kevin 
    
    $ sed -n ':z;N;$!bz;s/.*\(John.*\)/\1/;s/[Kk]evin/&\n/6M;s/\n\n.*//p' bar 
    John
    455
    Kevin
    4444
    Kevin
    ssssssss
    kevin
    pppppp
    kevin
    mmmmmm
    kevin
    sdffdsdss
    kevin
    
    $

    0
    1. Dan_NB Messages postés 9 Statut Membre
       
      Merci, je e vai tenter d'appliquer ca à mon problème ;)
      0