#1 Le 16/08/2020, à 20:05
- L'Africain
[Résolu] Inverser deux lignes dans un fichier
Bonjour,
J'ai un fichier avec plusieurs endroits où je dois y inverser des lignes.
Je fais une commande qui souvent fonctionne bien, mais là je n'ai aucune idée de pourquoi ça ne fonctionne pas. Les lignes à inverser ressemble à celle-ci, le repère c'est le chiffre 1 suivit d'un " à la fin de la première ligne:
<verse osisID="PssSol.2.1">
<title type="section" subtype="x-preverse"><w lemma="ψαλμός" morph="packard:N2 NSM" xlit="betacode:YALMO\S">ψαλμὸς</w> <w lemma="ὁ" morph="packard:RA DSM" xlit="betacode:TW=|">τῷ</w> <w lemma="Σαλωμών" morph="packard:N DSM" xlit="betacode:*SALWMWN">Σαλωμων</w> <w lemma="περί" morph="packard:P" xlit="betacode:PERI\">περὶ</w> <w lemma="Ἰερουσαλήμ" morph="packard:N AS" xlit="betacode:*IEROUSALHM">Ιερουσαλημ</w></title>
Faudrait que ça fasse ceci:
<title type="section" subtype="x-preverse"><w lemma="ψαλμός" morph="packard:N2 NSM" xlit="betacode:YALMO\S">ψαλμὸς</w> <w lemma="ὁ" morph="packard:RA DSM" xlit="betacode:TW=|">τῷ</w> <w lemma="Σαλωμών" morph="packard:N DSM" xlit="betacode:*SALWMWN">Σαλωμων</w> <w lemma="περί" morph="packard:P" xlit="betacode:PERI\">περὶ</w> <w lemma="Ἰερουσαλήμ" morph="packard:N AS" xlit="betacode:*IEROUSALHM">Ιερουσαλημ</w></title>
<verse osisID="PssSol.2.1">
J'utilise cette commande sed qui ne fonctionne pas:
sed -ri ':a;N;$!ba;s/(\t\t<verse osisID="*.*\.1">)\n(<title*.*title>)/\2\n\1/g' Monfichier
Sans pour autant me donner de retour d'erreur.
J'ai un peu essayer en modifiant les variables mais rien n'y fait!
Merci pour votre aide.
Dernière modification par L'Africain (Le 21/08/2020, à 19:10)
Ubuntu-Unity 24.04 Alienware X/Lubuntu-Mate
"Donne à celui qui te demande…" Mt 5,42
Hors ligne
#2 Le 16/08/2020, à 20:16
- pingouinux
Re : [Résolu] Inverser deux lignes dans un fichier
Bonsoir,
Je n'ai pas épluché ta commande, mais chez moi elle inverse bien les lignes.
Hors ligne
#3 Le 17/08/2020, à 08:22
- L'Africain
Re : [Résolu] Inverser deux lignes dans un fichier
C'est vraiment incompréhensible, j'ai déjà eu ce genre de comportement avec des commandes pour inverser qui fonctionne aléatoirement. Je vais essayer de l'isoler dans un autre script, car là elle est avec d'autres.
Edit: Dans un script à part ça ne va pas mieux, et si je l'exécute dans un terminal directement sur le fichier rien n'est modifié...
Aurais-je une mauvaise version de sed? Mais ce qui est bizarre c'est que plus haut dans le script j'ai le même genre de commande qui fonctionne:
sed -ri ':a;N;$!ba;s/(<\/chapter>)\n\t(<chapter osisID=")([A-Za-z/1-4]+)(\.1">)/\1\n\t<\/div>\n\t\t<div type="book" osisID="\3">\n\t\t\2\3\4/g'
Edit2:
Bizarrement si je mets juste les deux lignes dans un fichier ça fonctionne!
Dernière modification par L'Africain (Le 17/08/2020, à 08:32)
Ubuntu-Unity 24.04 Alienware X/Lubuntu-Mate
"Donne à celui qui te demande…" Mt 5,42
Hors ligne
#4 Le 17/08/2020, à 09:39
- k3c
Re : [Résolu] Inverser deux lignes dans un fichier
Utiliser un parser XML/Html au lieu de regex ?
Debian 12 sur Thinkpad reconditionné
Hors ligne
#5 Le 17/08/2020, à 10:18
- pingouinux
Re : [Résolu] Inverser deux lignes dans un fichier
Bizarrement si je mets juste les deux lignes dans un fichier ça fonctionne!
Dans ce cas, montre le fichier sur lequel la commande ne fonctionne pas.
Hors ligne
#6 Le 17/08/2020, à 11:51
- L'Africain
Re : [Résolu] Inverser deux lignes dans un fichier
Il est énorme, mais tu peux le télécharger ici. Sinon je l'ai mis sur mon nextcloud: https://us.cloudamo.com/f/19337293 J'espère qu'un des deux ira, d'habitude j'utilise send.firefox mais là il est down.
@K3c, c'est quoi un parser XML/Html? Je dois scripter car le fichier est amené à avoir des corrections ultérieures.
Merci pour votre aide!
Ubuntu-Unity 24.04 Alienware X/Lubuntu-Mate
"Donne à celui qui te demande…" Mt 5,42
Hors ligne
#7 Le 17/08/2020, à 11:57
- pingouinux
Re : [Résolu] Inverser deux lignes dans un fichier
Essaye de reproduire l'erreur sur un petit fichier que tu peux envoyer.
Hors ligne
#8 Le 17/08/2020, à 12:02
- L'Africain
Re : [Résolu] Inverser deux lignes dans un fichier
Je viens d'isolé une partie du fichier, et ça fonctionne. Donc voici le lien fichier entier pour que tu puisses voir.
Edit: J'ai l'impression, que c'est une erreur en lisant la première instance des lignes à changer. Car je retrouver un titre en tout début de texte, ce qui n'a rien à voir!
Edit2: Je confirme que le problème semble être au niveau de la lecteur des lignes. Car quand je passe la commande sur tout le fichier j'ai des titres du milieu du fichier qui se retrouve en haut!
Dernière modification par L'Africain (Le 17/08/2020, à 13:00)
Ubuntu-Unity 24.04 Alienware X/Lubuntu-Mate
"Donne à celui qui te demande…" Mt 5,42
Hors ligne
#9 Le 17/08/2020, à 13:04
- pingouinux
Re : [Résolu] Inverser deux lignes dans un fichier
Dans le fichier correspondant au lien (en #8), aucune ligne suivant la première chaîne recherchée ne commence par "<title".
Hors ligne
#10 Le 18/08/2020, à 12:25
- L'Africain
Re : [Résolu] Inverser deux lignes dans un fichier
Désolé je n'avais pas vu le message!
Je ne trouve pas l'endroit que tu m'indiques. J'ai bien 36 </title> et 35 <title ...> avec un <title>. tu peux me donner le numéro de la ligne?
Merci!
Ubuntu-Unity 24.04 Alienware X/Lubuntu-Mate
"Donne à celui qui te demande…" Mt 5,42
Hors ligne
#11 Le 18/08/2020, à 13:08
- pingouinux
Re : [Résolu] Inverser deux lignes dans un fichier
sed -ri ':a;N;$!ba;s/(\t\t<verse osisID="*.*\.1">)\n(<title*.*title>)/\2\n\1/g' Monfichier
sed -ri ':a;N;$!ba;s/(<\/chapter>)\n\t(<chapter osisID=")([A-Za-z/1-4]+)(\.1">)/\1\n\t<\/div>\n\t\t<div type="book" osisID="\3">\n\t\t\2\3\4/g'
Je n'avais pas remarqué que tu avais modifié la commande entre temps. De laquelle faut-il tenir compte ?
Hors ligne
#12 Le 18/08/2020, à 13:25
- L'Africain
Re : [Résolu] Inverser deux lignes dans un fichier
Désolé pour l 'embrouille, c'est de la première qu'il faut tenir compte, la seconde était une autre commande qui fonctionne pour le coup. C'était juste pour illustrer, mais c'était une mauvaise idée
Ubuntu-Unity 24.04 Alienware X/Lubuntu-Mate
"Donne à celui qui te demande…" Mt 5,42
Hors ligne
#13 Le 18/08/2020, à 14:52
- pingouinux
Re : [Résolu] Inverser deux lignes dans un fichier
Je ne trouve pas l'endroit que tu m'indiques. J'ai bien 36 </title> et 35 <title ...> avec un <title>. tu peux me donner le numéro de la ligne?
Aucune ligne vérifiant
<verse osisID="*.*\.1">
ne précède immédiatement une ligne contenant "<title". C'est pour ça que ton sed ne fait rien.
Hors ligne
#14 Le 18/08/2020, à 19:12
- L'Africain
Re : [Résolu] Inverser deux lignes dans un fichier
Ça doit pas précéder ça doit suivre comme ça:
<verse osisID="Odes.3.1">
<title type="...
C'est dans le resultat final que ça doit précéder.
Par contre je reçois pas d'alerte quand tu postes sur le forum c'est bizarre.
Ubuntu-Unity 24.04 Alienware X/Lubuntu-Mate
"Donne à celui qui te demande…" Mt 5,42
Hors ligne
#15 Le 18/08/2020, à 19:28
- pingouinux
Re : [Résolu] Inverser deux lignes dans un fichier
C'est dans le resultat final que ça doit précéder.
C'est bien comme ça que je l'ai compris, et c'est que je dis en #13.
Par contre je reçois pas d'alerte quand tu postes sur le forum c'est bizarre.
La case "Suivre cette discussion" est-elle cochée ?
Hors ligne
#16 Le 19/08/2020, à 05:46
- L'Africain
Re : [Résolu] Inverser deux lignes dans un fichier
C'est bien comme ça que je l'ai compris, et c'est que je dis en #13.
Pourtant c'est le cas dans l'exemple que j'ai mis en #14, non? Ou bien il y a un truc qui m'échappe...
La case "Suivre cette discussion" est-elle cochée ?
Oui bizarre.
Ubuntu-Unity 24.04 Alienware X/Lubuntu-Mate
"Donne à celui qui te demande…" Mt 5,42
Hors ligne
#17 Le 19/08/2020, à 06:02
- pingouinux
Re : [Résolu] Inverser deux lignes dans un fichier
Pourtant c'est le cas dans l'exemple que j'ai mis en #14, non? Ou bien il y a un truc qui m'échappe...
Non. Dans le fichier que j'ai récupéré à partir de ton lien en #8, il y a ceci :
<verse osisID="Odes.3.1">
<w lemma="στρερέω" morph="packard:VCI API3S" .............................................
Je vois que ton message #8 a été édité, et peut-être as-tu modifié ton fichier après que je l'aie récupéré.
Édité : Dans le fichier LXX.new.osis que j'ai, les lignes sont déjà inversées, et le lien n'existe plus.
Dernière modification par pingouinux (Le 19/08/2020, à 08:21)
Hors ligne
#18 Le 19/08/2020, à 18:20
- L'Africain
Re : [Résolu] Inverser deux lignes dans un fichier
Non d'une pipe! Je n'y comprends plus rien. J'ai remis le fichier ici.
L'alerte est revenue
Ubuntu-Unity 24.04 Alienware X/Lubuntu-Mate
"Donne à celui qui te demande…" Mt 5,42
Hors ligne
#19 Le 19/08/2020, à 22:09
- pingouinux
Re : [Résolu] Inverser deux lignes dans un fichier
Tu peux essayer ceci (en python3) :
$ cat inversion_lignes.py
#!/usr/bin/env python3
import sys, re
s=sys.stdin.read()
rec=re.compile('(\t\t<verse osisID=".*?\.1">)(\s+)(<title.*?title>)')
def repl(k): return k.group(3)+k.group(2)+k.group(1)
s=rec.sub(repl,s)
print(s,end='')
à appeler ainsi :
./inversion_lignes.py <fichier_1 >fichier_2
La suggestion de k3c en #4 serait quand même plus judicieuse.
Hors ligne
#20 Le 20/08/2020, à 12:00
- L'Africain
Re : [Résolu] Inverser deux lignes dans un fichier
Ça marche! Merci! Mais j'ai de nouveau pas eu d'alerte!!
La suggestion de k3c en #4 serait quand même plus judicieuse.
C'est quoi un parser?
Ubuntu-Unity 24.04 Alienware X/Lubuntu-Mate
"Donne à celui qui te demande…" Mt 5,42
Hors ligne
#21 Le 20/08/2020, à 12:15
- pingouinux
Re : [Résolu] Inverser deux lignes dans un fichier
C'est quoi un parser?
Il suffit de chercher avec ton moteur de recherche préféré : Parser
Là, je ne peux pas t'aider, mais il y a des spécialistes sur le forum.
Hors ligne
#22 Le 21/08/2020, à 19:11
- L'Africain
Re : [Résolu] Inverser deux lignes dans un fichier
Merci encore ça fonctionne bien.
Ubuntu-Unity 24.04 Alienware X/Lubuntu-Mate
"Donne à celui qui te demande…" Mt 5,42
Hors ligne