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.

#1 Le 13/02/2013, à 16:41

sergeG75018

sed et pattern

Bonjour.
j'ai un fichier de type xml avec un motif récurent et un fichier texte avec des lignes
je voudrais réussir à mettre la première ligne de mon fichier texte dans la première occurence de mon motif, la deuxième ligne dans la deuxième occurence etc...
Je cherche mais je vois rien, est-ce que sed suffit ou faut-il le coupler à un autre outil.
merci d'avance.

Dernière modification par sergeG75018 (Le 13/02/2013, à 16:42)


Ironie, sarcasme ou cynisme? Je ne sais plus

Hors ligne

#2 Le 13/02/2013, à 17:51

pingouinux

Re : sed et pattern

Bonjour,
Un petit exemple, peut-être (avec juste 2 ou 3 exemplaires du motif) ?

Hors ligne

#3 Le 14/02/2013, à 08:34

sergeG75018

Re : sed et pattern

bonjour.
fichier XML                                                                  fichier texte
<texte></texte>                                                             AAAAA
blablabla                                                                       BBBBB
blablabla                                                                       CCCCC
blablabla
<texte></texte>                                                           
blablabla                                                                       
blablabla
<texte></texte>


     Résultat
<texte>AAAAA</texte>                                                             
blablabla                                                                     
blablabla                                                                       
blablabla
<texte> BBBBB</texte>                                                           
blablabla                                                                       
blablabla
<texte>CCCCC</texte>

Merci.


Ironie, sarcasme ou cynisme? Je ne sais plus

Hors ligne

#4 Le 14/02/2013, à 08:50

pingouinux

Re : sed et pattern

Je te propose ce script en python :

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

import sys, re

# Usage :
# ./script.py xml_ini motif texte xml_fin

# Lecture des paramètres
xml_ini, motif, texte, xml_fin = sys.argv[1:5]

# Compilation du motif
rec=re.compile(motif)

# Ouverture des 3 fichiers (2 en lecture, 1 en écriture)
with open(xml_ini,'r') as fi, open(texte,'r') as ft, open(xml_fin,'w') as ff :
 # Lecture du fichier XML initial
   xml=fi.read()
 # Initialisation du fichier XML final
   xmlf=''
 # Boucle infinie
   while True :
    # Recherche du motif dans ce qui reste du XML initial
      k=rec.search(xml)
    # On sort de la boucle si on ne trouve plus le motif
      if not k : break
    # Lecture d'une ligne du fichier texte (en enlevant le '\n' final)
      lig=ft.readline()[:-1]
    # On incrémente le XML final : partie du XML initial précédant le motif + 1er groupe du motif + la ligne lue sur le fichier texte + 2ème groupe du motif
      xmlf+=xml[:k.start(0)]+k.group(1)+lig+k.group(2)
    # On ne garde que la fin du XML initial
      xml=xml[k.end(0):]
    # On incrémente le XML final : fin du XML initial qui ne contient plus de motif
   xmlf+=xml
# Écriture du XML final
   ff.write(xmlf)

Utilisation :

./script.py   xml_initial   '(<texte>)(</texte>)'   fichier_texte   xml_final

Édité : Ajout de commentaires

Dernière modification par pingouinux (Le 14/02/2013, à 09:09)

Hors ligne

#5 Le 14/02/2013, à 09:00

credenhill

Re : sed et pattern

hello

$ awk 'NR==FNR {t[NR]=$0; next} /<texte/ {sub(">", ">" t[++n])} {print}'  fichier.txt fichier.xml
<texte>AAAA</texte>
blablabla 
blablabla
blablabla
<texte>BBBB</texte>
blablabla
blablabla
<texte>CCCC</texte>
$ 

En ligne

#6 Le 14/02/2013, à 09:27

pingouinux

Re : sed et pattern

@credenhill  #5 :
C'est effectivement plus court, mais tu triches un peu, car tu ne testes que la première balise <texte> sans t'occuper de le présence de </texte> smile

Hors ligne

#7 Le 14/02/2013, à 09:34

sergeG75018

Re : sed et pattern

Merci pour ton aide,.
Si j'ai bien compris, au final ça doit donner ça.

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

import sys, re

# ./script.py xml_ini motif texte fichier2.xml
# ./script.py fichier.xml <comment></comment> fichier.txt fichier2.xml

fichier.xml, <comment></comment>, fichier.txt, fichier2.xml = sys.argv[1:5]
rec=re.compile(<comment></comment>)

with open(fichier.xml,'r') as fi, open(fichier.txt,'r') as ft, open(fichier2.xml,'w') as ff :
   fichier.xml=fi.read()
   fichier2.xml=''
   while True :
      k=rec.search(fichier.xml)
      if not k : break
      lig=ft.readline()[:-1]
      fichier2.xml+=fichier.xml[:k.start(0)]+k.group(1)+lig+k.group(2)
      fichier.xml=fichier.xml[k.end(0):]
   fichier2.xml+=fichier.xml
   ff.write(fichier2.xml)

Si c'est bon, j'ai une erreur.

bash: Erreur de syntaxe près du symbole inattendu « < »

Merci encore.

edition1: j'avais oublié les guillemets.
Maintenant j'ai cette erreur

$ : commande introuvable

Dernière modification par sergeG75018 (Le 14/02/2013, à 09:38)


Ironie, sarcasme ou cynisme? Je ne sais plus

Hors ligne

#8 Le 14/02/2013, à 09:45

pingouinux

Re : sed et pattern

Il faut créer le script python script.py avec un éditeur de texte (la 1ère ligne est #! /usr/bin/python). Ne pas toucher au contenu du script.
Ensuite, lui donner la permission d'exécution :

chmod u+x ./script.py

Puis lancer la commande comme je l'ai indiqué en #4 :

./script.py   xml_initial   '(<texte>)(</texte>)'   fichier_texte   xml_final

Remarque : La commande de credenhill est plus facile à utiliser

Hors ligne

#9 Le 14/02/2013, à 09:48

sergeG75018

Re : sed et pattern

pingouinux a écrit :

Remarque : La commande de credenhill est plus facile à utiliser

tout à fait, merci à vous 2.


Ironie, sarcasme ou cynisme? Je ne sais plus

Hors ligne

#10 Le 14/02/2013, à 10:19

credenhill

Re : sed et pattern

pingouinux a écrit :

@credenhill  #5 :
C'est effectivement plus court, mais tu triches un peu, car tu ne testes que la première balise <texte> sans t'occuper de le présence de </texte> smile

soit

awk 'NR==FNR {t[NR]=$0; next} /<texte>.*<\/texte>/ {sub(">", ">" t[++n])} {print}'  fichier.txt fichier.xml

j'assume que <texte> et </texte> sont sur la même ligne

Dernière modification par credenhill (Le 14/02/2013, à 10:23)

En ligne

#11 Le 14/02/2013, à 10:54

pingouinux

Re : sed et pattern

@credenhill : Ça reste plus court et plus facile à utiliser que ma proposition

Hors ligne