Sélectionner un intervalle de ligne entre motif1 et 6ième occure
Résolu
Dan_NB
Messages postés
9
Date d'inscription
Statut
Membre
Dernière intervention
-
Dan_NB Messages postés 9 Date d'inscription Statut Membre Dernière intervention -
Dan_NB Messages postés 9 Date d'inscription Statut Membre Dernière intervention -
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 :
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 !
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 !
A voir également:
- Sélectionner un intervalle de ligne entre motif1 et 6ième occure
- Partage de photos en ligne - Guide
- Mètre en ligne - Guide
- Site de vente en ligne gratuit entre particulier - Guide
- Formulaire en ligne de meta - Guide
- Aller à la ligne excel - Guide
3 réponses
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 :
Je te laisse adapter ;-))
PS. Et si la solution te convient, n'oublie pas d'aller aussi sur Developpez pour en rendre compte.
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.
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 :
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
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
$ 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 $