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 10/07/2023, à 16:29

L'Africain

(Résolu) Fusionner deux fichiers xml à un endroit précis

Bonjour,
Je travaille sur deux fichiers xml, kjvfull.xml et kjvdc.xml. Lorsque j'apporte des corrections à kjvfull.xml je lance un script qui me donne un fichier de sortie kjva.osis.xml qui est la fusion de kjvfull.xml et de kjvdc.xml. Mon problème, c'est que la fusion se fait sur une ligne aléatoire, car lorsque j'ajoute de nouvelles lignes au fichier de base, il faut que je modifier mon script pour changer le numéro de ligne. Je voulais savoir comment dire à mon script: "ajoute mon texte entre cette occurrence et cette occurrence", de sorte que je n'ai plus besoin de le modifier à chaque fois. Voici mon bricolage de script:

#!/bin/bash
rm kjv.osis.xml kjva.osis.xml
##Nettoyage de kjvfull.xml et production de kjv.osis.xml
sed 's#<note type="x-*.*</note>##g' kjvfull.xml >kjv.osis.xml
sed -i 's#<milestone type="x-extra-p"/>##g' kjv.osis.xml
sed -i 's#<milestone type="x-strongsMarkup" resp="[a-z0-9: -]*"/>##g' kjv.osis.xml

##Correction mineure dans kjvdc.xml pour produire a
sed 's#\t</osisText>##g;s#</osis>##g' kjvdc.xml >a
sed -i '/^$/d' a
##Supprime le début du fichier et produit b, 
sed '1,45d' a >b
## insère b à la ligne  26157 (ajouter le nombre de nouvelles lignes si besoin)
sed 26157rb kjv.osis.xml >kjva.osis.xml
#Copie les lignes 4 à 35 dans le fichier patch
sed -n 5,35p kjvdc.xml >patch

##insère le ficher patch après la ligne 63 dans kjva.osis.xml (ajouter le nombre de nouvelle ligne si besoin)

sed -i 63rpatch kjva.osis.xml
##Corrections finale dans le fichier kjva.osis.xml
sed -ri 's/King James Version \(1769\) with Strongs Numbers and Morphology/King James Version \(1769\) with Apocrypha/g;s/osisWork="KJV"/osisWork="KJVA"/g;s/OSIS">Bible\.KJV</OSIS">Bible\.KJVA</g;s/osisIDWork="KJV"/osisIDWork="KJVA"/g' kjva.osis.xml
##Vérification des fichiers
xmllint --noout --schema ~/.bin/schema/osisCore.2.1.1-cw-latest.xsd kjva.osis.xml kjv.osis.xml kjvfull.xml
rm a b patch

Je souhaiterais ajouter mon texte (b le script) entre ces deux lignes:

</div>
<div type="bookGroup" canonical="true" subType="x-NT">

On m'a aussi parlé de xmlproc un truc du genre qui permet de faire ce genre d'opération plus facilement.

Merci pour votre aide.

Dernière modification par L'Africain (Le 21/07/2023, à 14:51)


Ubuntu-Unity 18.04 LDLC (clevo) X/Lubuntu-Mate
"Donne à celui qui te demande…" Mt 5,42

Hors ligne

#2 Le 10/07/2023, à 16:59

Watael

Re : (Résolu) Fusionner deux fichiers xml à un endroit précis

salut,

j'ai un peu cherché : STFW!

pourquoi ne fais-tu pas un include de kjvdc.xml dans kjvdc.xml ?
ainsi, de manière permanente, le premier "sera" dans le second.

NB: travailler le XML avec du shell est une très mauvaise idée.
le shell pour travailler sur des lignes, c'est bien, mais pour tout ce qui est fichier de langages à balises, il vaut mieux utiliser les outils ad'hoc (xslt pour le XML, jq pour le JSON...)

Dernière modification par Watael (Le 10/07/2023, à 17:15)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#3 Le 10/07/2023, à 17:00

iznobe

Re : (Résolu) Fusionner deux fichiers xml à un endroit précis

Salut , peut etre de la sorte : https://stackoverflow.com/questions/953 … -of-a-file si c' est basé sur un numero de ligne .


retour COMPLET et utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .

Hors ligne

#4 Le 10/07/2023, à 19:14

L'Africain

Re : (Résolu) Fusionner deux fichiers xml à un endroit précis

@Watael,
le include n'est pas valide dans le cas d'un osis.xml. En tout cas ça ne valide pas il refuse l'entrée. Pour les autres outils en dehors du shell je suis prêt à apprendre. Je n'y connais rien.
@iznobe, pour une ligne je suis ok, c'est pour une occurence que je voudrais y arriver.


Ubuntu-Unity 18.04 LDLC (clevo) X/Lubuntu-Mate
"Donne à celui qui te demande…" Mt 5,42

Hors ligne

#5 Le 10/07/2023, à 19:29

iznobe

Re : (Résolu) Fusionner deux fichiers xml à un endroit précis

Want to add <added text> on the first 10 lines?

$

 sed -i '1,10s/^/<added text> /' file

qu ' est ce qui empeche de recuperer le numero de la ligne a partir de laquelle tu veux inserer ton " texte " dans le fichier " receveur " ,  le nombre de lignes totales a inserer , puis de faire par exemple :

sed -i '$ligne_debut_insertion,$fin_ligne_insertions/^/<$added_text> /' fichier_receveur 

puisque tu es dans un script ?

Dernière modification par iznobe (Le 10/07/2023, à 19:30)


retour COMPLET et utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .

Hors ligne

#6 Le 10/07/2023, à 19:32

L'Africain

Re : (Résolu) Fusionner deux fichiers xml à un endroit précis

@iznobe, oui je voudrais récupérer les deux lignes en questions, sauf que je ne sais pas comment faire. Mes connaissances en shell sont assez limitées. C'est bien une telle commande qui me serait utile.


Ubuntu-Unity 18.04 LDLC (clevo) X/Lubuntu-Mate
"Donne à celui qui te demande…" Mt 5,42

Hors ligne

#7 Le 10/07/2023, à 20:01

iznobe

Re : (Résolu) Fusionner deux fichiers xml à un endroit précis

un exemple parmi d' autres https://forums.commentcamarche.net/foru … ns-une-var
</div>
<div type="bookGroup" canonical="true" subType="x-NT">
je suppose que la ligne precedent celle-ci : <div type="bookGroup" canonical="true" subType="x-NT"> c' est certainement la ligne la ligne n-1 .
donc tu recherches le numero de celle-ci dans ton fichier <div type="bookGroup" canonical="true" subType="x-NT"> tu la places dans une variable du nom de ton choix ( aller disons ligne_fin_insertion ) et tu n' as plus qu ' a remplacer dans la commande precedente par le nom de ta variable .
ce qui donnerait potentiellement :

ligne_fin_insertion=$(sed -n '/<div type="bookGroup" canonical="true" subType="x-NT">/=' fichier)
sed -i '$ligne_fin_insertion - 1 ,$ligne_fin_insertion s/^/<$added_text> /' fichier_receveur 

Mais le specialiste en commande et code , ce n' est pas moi , c' est plutot watael qu il faudrait ecouter .

Dernière modification par iznobe (Le 10/07/2023, à 20:13)


retour COMPLET et utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .

Hors ligne

#8 Le 10/07/2023, à 20:44

Watael

Re : (Résolu) Fusionner deux fichiers xml à un endroit précis

et Watael a dit :

travailler le XML avec du shell est une très mauvaise idée.
le shell pour travailler sur des lignes, c'est bien, mais pour tout ce qui est fichier de langages à balises, il vaut mieux utiliser les outils ad'hoc (XSLT pour le XML, [...]...)

or, pour ça, je ne ferais que du bricolage en STFW!


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#9 Le 10/07/2023, à 21:17

L'Africain

Re : (Résolu) Fusionner deux fichiers xml à un endroit précis

watael a écrit :

travailler le XML avec du shell est une très mauvaise idée.
le shell pour travailler sur des lignes, c'est bien, mais pour tout ce qui est fichier de langages à balises, il vaut mieux utiliser les outils ad'hoc (XSLT pour le XML, [...]...)

Je suis d'accord que c'est une mauvaise idée, sauf que pour l'instant c'est la seule que je sais fonctionné, et le resultat final est bon sauf en ce qui concerne la modif de la ligne.


Ubuntu-Unity 18.04 LDLC (clevo) X/Lubuntu-Mate
"Donne à celui qui te demande…" Mt 5,42

Hors ligne

#10 Le 11/07/2023, à 08:35

L'Africain

Re : (Résolu) Fusionner deux fichiers xml à un endroit précis

Bonjour,
La commande pour récupérer la ligne iznobe, marche bien, mais je n'arrive pas à mettre ça dans une boucle. De plus je voudrais utiliser:

sed $insertrb kjv.osis.xml >kjva.xml

car c'est un gros fichier qu'il faut que j'insère.


Ubuntu-Unity 18.04 LDLC (clevo) X/Lubuntu-Mate
"Donne à celui qui te demande…" Mt 5,42

Hors ligne

#11 Le 21/07/2023, à 14:51

L'Africain

Re : (Résolu) Fusionner deux fichiers xml à un endroit précis

Voilà la solution que m'a donné un ami, si jamais ça interesse quelqu'un, c'est un truc un peu bizarre mais ça marche:

NT_LINE="<div type=\"bookGroup\" canonical=\"true\" subType=\"x-NT\">"
while IFS= read -r LINE ; do
if [ "$LINE" == "$NT_LINE" ] ; then cat b >> kjva.xml
fi
echo "$LINE" >> kjva.xml
done < kjv.osis.xml

Ce script ajoutte avant la ligne qui suit NT_LINE le texte contenu dans b et donne en fichier de sorti le fichier kjva.xml


Ubuntu-Unity 18.04 LDLC (clevo) X/Lubuntu-Mate
"Donne à celui qui te demande…" Mt 5,42

Hors ligne