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

Résolu/Fermé
Dan_NB Messages postés 9 Date d'inscription jeudi 15 août 2013 Statut Membre Dernière intervention 17 août 2013 - 16 août 2013 à 20:51
Dan_NB Messages postés 9 Date d'inscription jeudi 15 août 2013 Statut Membre Dernière intervention 17 août 2013 - 17 août 2013 à 18:39
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

zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 406
16 août 2013 à 21:01
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
Dan_NB Messages postés 9 Date d'inscription jeudi 15 août 2013 Statut Membre Dernière intervention 17 août 2013
16 août 2013 à 22:07
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
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 406
16 août 2013 à 22:22
$ 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
Dan_NB Messages postés 9 Date d'inscription jeudi 15 août 2013 Statut Membre Dernière intervention 17 août 2013
17 août 2013 à 18:39
Merci, je e vai tenter d'appliquer ca à mon problème ;)
0