Pages : 1
#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>
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
@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>
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
Pages : 1