Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#26 Le 07/06/2012, à 10:36

hugodu78

Re : [shell] récupérer texte entre 2 balises [Résolu]

Bonjour 106643,

C'est normal ce message avant d'ouvrir le fichier car il n'a pas d'extension. Exemple si tu avais une extension .txt il aurait su qu'il fallait l'ouvrir avec bloc note ou notepad, .html avec un navigateur internet, ...

Après pour ton doublon de name je n'ai pas ce problème et je ne peux pas t'aider. Attends les experts du code.

Bon courage et tiens nous au courant si tu as des informations.

Hors ligne

#27 Le 07/06/2012, à 11:26

pingouinux

Re : [shell] récupérer texte entre 2 balises [Résolu]

Bonjour,
Mon script en python du #19, très légèrement modifié, semble faire l'affaire.

Le fichier texte :

$ cat 106643.txt
header 1
header 2
header 3
header 4
header 5
header 6
blablabla
<begin>
name "nom job 1"
le texte 1 que je souhaite récupérer
name "nom job 1 ne compte pas"
suite texte 1 que je souhaite récupérer
<end>
blablabla
<begin>
name "nom job 2"
le texte 2 que je souhaite récupérer
suite texte 2 que je souhaite récupérer
name "nom job 2 ne compte pas"
<end>
blablabla

Le script :

$ cat 106643.py
#! /usr/bin/python
# -*- coding: utf-8 -*-

import sys, re

rec_header=re.compile('(.*?\n){2}',re.M)
rec_balises=re.compile('(<begin>.*?<end>)',re.M|re.S)
rec_ident=re.compile('^name\s+"?(.*?)"?$',re.M)
with open(sys.argv[1],'r') as f :
   ligs=f.read()
   k=rec_header.match(ligs)
   if k : header=k.group(0)
   n=0
   for k in rec_balises.findall(ligs) :
      n+=1
      k_nom=rec_ident.search(k)
      if k_nom : nom=k_nom.group(1)
      with open('%s'%nom,'w') as f : f.write( '%s%s\n'%(header,k) )

Lancement du script :

$ ./106643.py 106643.txt

Visualisation d'un résultat :

$ cat nom\ job\ 1
header 1
header 2
<begin>
name "nom job 1"
le texte 1 que je souhaite récupérer
name "nom job 1 ne compte pas"
suite texte 1 que je souhaite récupérer
<end>

Ajouté :

Lignes modifiées dans le script d'origine :

rec_header=re.compile('(.*?\n){6}',re.M)

devient

rec_header=re.compile('(.*?\n){2}',re.M)
rec_ident=re.compile('^Identifier\s+"?(.*?)"?$',re.M)

devient

rec_ident=re.compile('^name\s+"?(.*?)"?$',re.M)

Dernière modification par pingouinux (Le 07/06/2012, à 12:02)

Hors ligne

#28 Le 07/06/2012, à 11:46

106643

Re : [shell] récupérer texte entre 2 balises [Résolu]

Thanks pour le code. Je vais installer python.

Hors ligne

#29 Le 07/06/2012, à 12:02

hugodu78

Re : [shell] récupérer texte entre 2 balises [Résolu]

@106643: Si tu es sur Ubuntu python est déjà installé

Hors ligne

#30 Le 07/06/2012, à 12:16

106643

Re : [shell] récupérer texte entre 2 balises [Résolu]

Quand je fais ./106643.py 106643.txt il me dit permission non accordée donc je fais sudo ./106643.py 106643.txt et cette fois il me dit command not found

Hors ligne

#31 Le 07/06/2012, à 12:18

pingouinux

Re : [shell] récupérer texte entre 2 balises [Résolu]

chmod u+x ./106643.py
./106643.py 106643.txt

Hors ligne

#32 Le 07/06/2012, à 12:18

106643

Re : [shell] récupérer texte entre 2 balises [Résolu]

C'est bon j'ai réussi et le code fonctionne
J'ai fait python 106643.py 106643.txt . Merci à vous 2.

Dernière modification par 106643 (Le 07/06/2012, à 12:19)

Hors ligne

#33 Le 07/06/2012, à 12:18

Postmortem

Re : [shell] récupérer texte entre 2 balises [Résolu]

Salut,
Avec awk, enfin, gawk plus précisémment :

gawk 'BEGIN { FS=OFS="\n"; RS="\n?<(begin|end)>\n?" }
    NR == 1 { HEADER_JOB=$1 OFS $2 }
    NR > 1 && $1 ~ /[Nn]ame "[^"]+"/ { split($1,NOM_JOB,/"/)
        print HEADER_JOB, "<begin>", $0, "<end>" > NOM_JOB[2]".txt" }' test.txt

Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#34 Le 07/06/2012, à 12:28

106643

Re : [shell] récupérer texte entre 2 balises [Résolu]

Salut Postmortem
J'ai essayé ton code mais j'ai le message gawk : commande introuvable.

Hors ligne

#35 Le 07/06/2012, à 12:37

Postmortem

Re : [shell] récupérer texte entre 2 balises [Résolu]

Essaie avec awk à la place. Mais selon la version, ça ne fonctionnera pas. Il faudrait alors installer gawk.

Edit : il y a aussi nawk ou mawk qui sont des fois installés. Mais pareil, selon les versions, ça peut ne pas fonctionner. Le plus mieux, c'est gawk.

Dernière modification par Postmortem (Le 07/06/2012, à 12:38)


Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#36 Le 07/06/2012, à 13:42

106643

Re : [shell] récupérer texte entre 2 balises [Résolu]

Re Postmortem. J'ai installé gawk comme tu m'as dit et ça marche très bien. Merci à vous 3.

Hors ligne

#37 Le 07/06/2012, à 17:23

hugodu78

Re : [shell] récupérer texte entre 2 balises [Résolu]

@106643: Pas de problème mais moi je n'ai pas fait grand chose. Remercie les développeurs.

Postmortem a écrit :

:

gawk 'BEGIN { FS=OFS="\n"; RS="\n?<(begin|end)>\n?" }
    NR == 1 { HEADER_JOB=$1 OFS $2 }
    NR > 1 && $1 ~ /[Nn]ame "[^"]+"/ { split($1,NOM_JOB,/"/)
        print HEADER_JOB, "<begin>", $0, "<end>" > NOM_JOB[2]".txt" }' test.txt

@Postmortem : Petite question. Juste pour ma culture.
Si nous avons des begin action et end action au lieu de <begin> et <end>.
Est ce que le code marche toujours ou faut il changer des choses car il ne prend pas
en compte les espaces ?

Hors ligne

#38 Le 07/06/2012, à 19:18

Postmortem

Re : [shell] récupérer texte entre 2 balises [Résolu]

Il faut modifier le contenu de la variable RS. Cette variable défini le séparateur d'enregistrement dans awk.
Par défaut, le séparateur d'enregistrement est le retour à la ligne, donc une ligne est égale à un enregistrement.
Si à la place de <begin> <end> tu as <begin action> <end action>, il faut définir la variable RS ainsi :

RS="\n?<(begin|end) action>\n?"

Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#39 Le 07/06/2012, à 19:30

hugodu78

Re : [shell] récupérer texte entre 2 balises [Résolu]

ok très intéressant. Et le "?" c'est bien pour lui dire que c'est < et non inférieur ?
D'après des tests oui smile

Dernière modification par hugodu78 (Le 07/06/2012, à 20:59)

Hors ligne

#40 Le 08/06/2012, à 09:10

Postmortem

Re : [shell] récupérer texte entre 2 balises [Résolu]

Bonjour!
Le ? C'est pour dire que le caractère précédent est présent zéro ou une fois. Dans notre cas, c'est donc pour dire qu'il y a zéro ou un retour à la ligne.


Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#41 Le 08/06/2012, à 10:01

hugodu78

Re : [shell] récupérer texte entre 2 balises [Résolu]

OK. Merci beaucoup pour toutes ces explications.
Bonne continuation et merci beaucoup

Hors ligne

#42 Le 08/06/2012, à 12:17

Postmortem

Re : [shell] récupérer texte entre 2 balises [Résolu]

De rien ! Bonne journée !


Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#43 Le 06/04/2016, à 10:31

frpatte

Re : [shell] récupérer texte entre 2 balises [Résolu]

Bonjour,

Je vois que ce fil est ancien, mais j'y ai trouvé un script qui m'intéresse:

awk '
/^<begin>/ { f=1; nf++; next }
/^<end>/ { f=0 }
{ if (f) print > "f-" nf; }
' < fichier_entree

Posté par dev/random qui ajoute que le nom en sortie est modifiable... Ma question: est-il possible d'avoir comme nom de fichier un nom que l'on mettrait après la balise <begin> dans le fichier que l'on veut traiter?

<begin> (toto_machin)
le texte 1 que je souhaite récupérer
<end>

et le texte 1 se trouve dans le fichier toto_machin

Merci

F.P.

Hors ligne

#44 Le 06/04/2016, à 11:11

credenhill

Re : [shell] récupérer texte entre 2 balises [Résolu]

hello

$ cat fichier
<begin> (toto_machin)
le texte 1 que je souhaite récupérer
le texte 2 que je souhaite récupérer
<end>
$ awk -F "[()]" '/^<begin>/ {f=1; n=$2; next} /^<end>/ {f=0} f {print $0 > n}' fichier
$ cat toto_machin
le texte 1 que je souhaite récupérer
le texte 2 que je souhaite récupérer

Dernière modification par credenhill (Le 06/04/2016, à 11:12)

Hors ligne

#45 Le 08/04/2016, à 09:38

frpatte

Re : [shell] récupérer texte entre 2 balises [Résolu]

Merci! Exactement ce que je cherche.

Hors ligne