#1 Le 17/06/2016, à 13:13
- L'Africain
Modifier fichier xml en duplicant contenu
Bonjour,
J'ai un fichier xml, dans lequel j'ai un certains de nombre d'erreurs que je voudrais corriger automatiquement mais je ne sais pas si c'est possible. Alors voilà ce que je souhaiterais faire. J'ai ceci :
osisRef="Lk.">(Lc 6, 29-30)
ou ceci:
osisRef="Mk.">(Mc 1,22; Lc 4,32)
et je voudrais ajouter ce qu'il y a entre parenthèse, après le . qui suit soit Mk ou Lk, exemple:
osisRef="Lk.6.29-30">(Lc 6, 29-30)
osisRef="Mk.1.22 Lk.4.32">(Mc 1,22; Lc 4,32)
La différence entre ce qui est entre parenthèse et ce que je veux ajouter précédemment c'est que les virgules et les espaces deviennent des points. les point-virgules deviennent des espaces et les c deviennent des k. Mais ce dernier problème est moins important car je peux facilement modifier plus tard "Mc. par "Mk. avec sed.
Je ne sais pas si c'est possible. J'espère n'avoir pas trop mal décrit mon problème.
Merci d'avance,
Ubuntu-Unity 24.04 Alienware X/Lubuntu-Mate
"Donne à celui qui te demande…" Mt 5,42
Hors ligne
#2 Le 17/06/2016, à 14:35
- pingouinux
Re : Modifier fichier xml en duplicant contenu
Bonjour,
Il faudrait que tu précises, parce qu'avec ce que tu demandes en #1, tu devrais obtenir ceci :
osisRef="Lk.Lk.6..29-30">(Lc 6, 29-30)
osisRef="Mk.Mk.1.22 .Lk.4.32">(Mc 1,22; Lc 4,32)
Hors ligne
#3 Le 17/06/2016, à 16:26
- L'Africain
Re : Modifier fichier xml en duplicant contenu
ok, on peut considérer que le mk et le lk n'est pas dans la ligne à traiter si c'est plus facile. Car c'est déjà une transformation que j'ai fait manuellement avec sed pensant que ça serait plus simple pour le reste. Donc je récapitule voici le fichier original :
osisRef="">(Lc 6, 29-30)
et voici ce que j'aimerais bien :
osisRef="Lk.6.29-30">(Lc 6, 29-30)
Sachant que les chiffres sont à chaque fois différents.
Merci pour ton aide !
Dernière modification par L'Africain (Le 17/06/2016, à 16:28)
Ubuntu-Unity 24.04 Alienware X/Lubuntu-Mate
"Donne à celui qui te demande…" Mt 5,42
Hors ligne
#4 Le 17/06/2016, à 16:29
- pingouinux
Re : Modifier fichier xml en duplicant contenu
Dans ce cas, essaye ceci :
awk -F '["()]' '/osisRef=/{mod=$4;gsub("; *",";",mod);gsub(", *",".",mod);gsub(" ",".",mod);gsub(";"," ",mod);gsub("c","k",mod);printf("%s\"%s\"%s(%s)\n",$1,mod,$3,$4)}' fichier
Hors ligne
#5 Le 17/06/2016, à 17:04
- L'Africain
Re : Modifier fichier xml en duplicant contenu
Ça fonctionne pas :
...@W54:/home...SFM_officiel_sword$ awk -F '["()]' '/osisRef=/{mod=$4;gsub("; *",";",mod);gsub(", *",".",mod);gsub(" ",".",mod);gsub(";"," ",mod);gsub("c","k",mod);printf("%s\"%s\"%s(%s)\n",$1,mod,$3,$4)}' NYM.osis.xml
<title type=""><reference osisRef=()
<title type=""><reference osisRef=()
<title type=""><reference osisRef=()
<title type=""><reference osisRef=()
<title type=""><reference osisRef=()
<title type=""><reference osisRef=()
<title type=""><reference osisRef=()
<title type=""><reference osisRef=()
<title type=""><reference osisRef=()
<title type=""><reference osisRef=()
<title type=""><reference osisRef=()
<title type=""><reference osisRef=()
<title type=""><reference osisRef=()
<title type=""><reference osisRef=()
<title type=""><reference osisRef=()
<title type=""><reference osisRef=()
...
Mais rien de changer dans le fichier.
Ubuntu-Unity 24.04 Alienware X/Lubuntu-Mate
"Donne à celui qui te demande…" Mt 5,42
Hors ligne
#6 Le 17/06/2016, à 17:10
- pingouinux
Re : Modifier fichier xml en duplicant contenu
Ton fichier ne semble pas ressembler à ton exemple de départ, sur lequel j'ai testé ma commande.
Il faut que tu montres un exemple réaliste.
Hors ligne
#7 Le 17/06/2016, à 19:27
- L'Africain
Re : Modifier fichier xml en duplicant contenu
Je n'ai mis qu'une partie de la ligne peut-être est-ce là le problème? Au cas où c'est ça voici deux lignes complètes :
<title type="parallel"><reference osisRef="">(Mc 1,40-45; Lc 5,12-14)</reference></title>
et:
<title type="parallel"><reference osisRef="">(Lc 13,23-24)</reference></title>
Ubuntu-Unity 24.04 Alienware X/Lubuntu-Mate
"Donne à celui qui te demande…" Mt 5,42
Hors ligne
#8 Le 17/06/2016, à 19:56
- pingouinux
Re : Modifier fichier xml en duplicant contenu
Je n'ai mis qu'une partie de la ligne peut-être est-ce là le problème?
Évidemment.
awk -F '[()]' '/osisRef=/{mod=$2;gsub("; *",";",mod);gsub(", *",".",mod);gsub(" ",".",mod);gsub(";"," ",mod);gsub("c","k",mod);gsub("\"\"","\""mod"\"",$1);printf("%s(%s)%s\n",$1,$2,$3)}' fichier
Hors ligne
#9 Le 17/06/2016, à 20:15
- L'Africain
Re : Modifier fichier xml en duplicant contenu
Ok ça marche mais dans le fichier de sortie il ne reste plus que les lignes concerné par la modification, toutes les autres lignes ont disparues?? Avec awk y a-t-il une option -i comme avec sed?
Dernière modification par L'Africain (Le 17/06/2016, à 20:16)
Ubuntu-Unity 24.04 Alienware X/Lubuntu-Mate
"Donne à celui qui te demande…" Mt 5,42
Hors ligne
#10 Le 17/06/2016, à 20:24
- pingouinux
Re : Modifier fichier xml en duplicant contenu
J'en ai profité pour améliorer un peu la commande.
awk -F '[()]' '/osisRef=/{mod=$2;gsub("; *",";",mod);gsub(", *",".",mod);gsub(" ",".",mod);gsub(";"," ",mod);gsub("c","k",mod);gsub("Ref=\"[^\"]*\"","Ref=\""mod"\"")}{print}' fichier
Hors ligne
#11 Le 17/06/2016, à 20:38
- L'Africain
Re : Modifier fichier xml en duplicant contenu
Ça fonctionne à merveille incroyable ! Si je peux le faire travailler directement sur le fichier genre avec un -i... ça serait top. Mais sinon c'est déjà super.
Un grand merci pingouinux!
Ubuntu-Unity 24.04 Alienware X/Lubuntu-Mate
"Donne à celui qui te demande…" Mt 5,42
Hors ligne
#12 Le 17/06/2016, à 20:50
- pingouinux
Re : Modifier fichier xml en duplicant contenu
Si je peux le faire travailler directement sur le fichier genre avec un -i... ça serait top.
Je ne pense pas que ce soit possible, mais tu peux faire :
awk ...... fichier >fichier_temporaire
mv fichier_temporaire fichier
Personnellement, je préfère toujours vérifier le résultat avant d'écraser le fichier d'origine.
Hors ligne
#13 Le 18/06/2016, à 06:01
- pingouinux
Re : Modifier fichier xml en duplicant contenu
@Anthony87 #13 :
Question 1 : Non, loin de là
Question 2 : J'ai beaucoup pratiqué lorsque j'étais en activité
Hors ligne
#14 Le 18/06/2016, à 09:19
- L'Africain
Re : Modifier fichier xml en duplicant contenu
En tous cas c'est bluffant un très grand merci je viens de gagner deux jours de travail!
Ubuntu-Unity 24.04 Alienware X/Lubuntu-Mate
"Donne à celui qui te demande…" Mt 5,42
Hors ligne
#15 Le 18/06/2016, à 11:37
- credenhill
Re : Modifier fichier xml en duplicant contenu
hello
Avec awk y a-t-il une option -i comme avec sed?
Hors ligne
#16 Le 18/06/2016, à 11:58
- pingouinux
Re : Modifier fichier xml en duplicant contenu
@credenhill : Merci pour le tuyau
Hors ligne
#17 Le 18/06/2016, à 13:27
- L'Africain
Re : Modifier fichier xml en duplicant contenu
Bonjour,
Je suis désolé c'est encore moi... La commande fonctionne très très bien mais j'ai constaté que mon logiciel ne lit pas correctement le fichier transformé, s'il y a plusieurs références qui se suivent il faudrait transformer le texte de telle sorte que la transformation précède la référence exemple, ligne originale :
<title type="parallel"><reference osisRef="">(Mc 1, 2-6; Lc 3, 1-6; Jn 1, 19-23)</reference></title></p>
Ligne finale:
<title type="parallel"><reference osisRef="Mk.1.2-6">(Mc 1, 2-6; <reference osisRef="Lk.3.1-6">Lc 3, 1-6; <reference osisRef="Jn.1.19-23">Jn 1, 19-23)</reference></title></p>
Je ne voudrais pas abuser de votre générosité, mais si c'est possible ça serait formidable!
Ubuntu-Unity 24.04 Alienware X/Lubuntu-Mate
"Donne à celui qui te demande…" Mt 5,42
Hors ligne
#18 Le 19/06/2016, à 09:34
- pingouinux
Re : Modifier fichier xml en duplicant contenu
Je ne voudrais pas abuser de votre générosité, mais si c'est possible ça serait formidable!
Je vais attendre la prochaine modif de la demande pour regarder…
Questions :
Est-il normal que le premier osisRef= soit à l'extérieur des parenthèses, et les autres à l'intérieur ?
Est-il normal qu'une seule balise <reference...> soit fermée par </reference>
Hors ligne
#19 Le 19/06/2016, à 13:38
- L'Africain
Re : Modifier fichier xml en duplicant contenu
Est-il normal que le premier osisRef= soit à l'extérieur des parenthèses, et les autres à l'intérieur ?
Oui ça c'est normal, sinon ça ne fonctionne pas la parenthèse sera mal interprétée.
Est-il normal qu'une seule balise <reference...> soit fermée par </reference>
Bien vu, il me reporte une erreur si je ne ferme pas avec </reference>
Ce qui veut dire qu'il faudrait écrire la ligne comme suit :
<title type="parallel"><reference osisRef="Mk.1.2-6">(Mc 1, 2-6; </reference><reference osisRef="Lk.3.1-6">Lc 3, 1-6; </reference><reference osisRef="Jn.1.19-23">Jn 1, 19-23)</reference></title>
Merci !
Ubuntu-Unity 24.04 Alienware X/Lubuntu-Mate
"Donne à celui qui te demande…" Mt 5,42
Hors ligne
#20 Le 19/06/2016, à 13:52
- pingouinux
Re : Modifier fichier xml en duplicant contenu
Je suppose que tu as oublié </p> à la fin de la ligne que tu montres en #20.
Du coup j'ai trouvé plus simple de le refaire en python :
$ cat corrig.py
import sys, re
fo=sys.stdout
rec=re.compile('(.*osisRef=")[^"]*(">\()([^)]+)(.*)')
def modiref(ref):
ref=re.sub(', *','.',ref)
ref=re.sub(' +','.',ref)
ref=ref.replace('c','k')
return ref
for lig in sys.stdin.readlines():
k=rec.match(lig)
if k:
refs=re.split('; *',k.group(3))
fo.write("%s%s%s%s"%(k.group(1),modiref(refs[0]),k.group(2),refs[0]))
for ref in refs[1:]: fo.write('; </reference><reference osisRef="%s">%s'%(modiref(ref),ref))
fo.write('%s\n'%(k.group(4)))
else: fo.write(lig)
À lancer ainsi :
python corrig.py <fichier
Édité : Simplification du script
Dernière modification par pingouinux (Le 19/06/2016, à 14:10)
Hors ligne
#21 Le 19/06/2016, à 15:13
- L'Africain
Re : Modifier fichier xml en duplicant contenu
Impressionnant !!! Ça fonctionne parfaitement, merci beaucoup. Je vais même envoyer ça aux développeurs de sword (logiciel biblique) pour qu'ils puissent en tirer partie...
Je suppose que tu as oublié </p> à la fin de la ligne que tu montres en #20.
Non, j'ai copié une autre ligne par mégarde et il n'y avait pas de </p> j'en ai regardé d'autres et en général il n'y a pas de </p> à la fin.
Merci pingouinux...
Ubuntu-Unity 24.04 Alienware X/Lubuntu-Mate
"Donne à celui qui te demande…" Mt 5,42
Hors ligne