#1 Le 10/11/2018, à 15:58
- L'Africain
[Résolu] Commande sed qui ne s'éxécute qu'au deuxième passage
Bonjour,
J'ai un script qui ressemble à ça:
#!/bin/bash
#convertir les odt en txt
unoconv -f txt *.odt
killall soffice.bin
#Pour supprimer les bom des fichiers utf8
find . -type f -exec sed 's/\xEF\xBB\xBF//g' -i.bak {} \; -exec rm {}.bak \;
# pour chaque fichier dans ls *.txt
for FILE in `ls *.txt` ; do
#Commence par mettre à la ligne chaque verset
sed -ri 's/\.1/\. 1/g' $FILE
sed -ri 's/([0-9][0-9])\. /\1 /g' $FILE
sed -ri 's/([0-9])\. /\1 /g' $FILE
sed -i 's/ [0-9][0-9] /\n&/g' $FILE
sed -i 's/ [0-9] /\n&/g' $FILE
#Supprime les espaces éventuel en début de ligne
sed -i 's/^[ ]*//g' $FILE
#Ajout "\v " devant chaque ligne commençant par un puis deux chiffres suivit d'un espace et de texte
sed -i 's/^[0-9] [a-z]*/\\v &/g' $FILE
sed -i 's/^[0-9][0-9] [a-z]*/\\v &/g' $FILE
sed -i 's/^[0-9][0-9][0-9] [a-z]*/\\v &/g' $FILE
#ajoute \c devant chaque ligne commencant par deux chiffre
# sed -i 's/^[0-9]+\n/\\c &\n\\p/g' $FILE
sed -i 's/^[0-9]$/\\c &\n\\p/g' $FILE
sed -i 's/^[0-9][0-9]$/\\c &\n\\p/g' $FILE
sed -i 's/^[0-9][0-9][0-9]$/\\c &\n\\p/g' $FILE
# Mettre \s devant les titre
# sed -i 's/^[A-Z].*$/\\s &\n\\p/g' $FILE
sed -i 's/^[1-2].*$/\\s &\n\\p/g' $FILE
# sed -i 's/^[A-Z]/\\mt1 &/g' $FILE
# sed -i 's/^[1-2] [A-Z]/\\mt1 &/g' $FILE
rename 's/txt/usfm/g' $FILE
done
$HOME/.bin/titre-chap.sh
for FILE in `ls *.usfm` ; do
#Supprime les lignes vide et ajoute "\id \mt1" à la première ligne
sed -i '/./!d; 1i\\\id \n\\h \n\\toc1 \n\\toc2 \n\\toc3 \n\\mt1 ' $FILE
#Colle la ligne 2 et 3
sed -i '/\\mt1$/N; s/\n/ /' $FILE
done
Excusez ça pourrait être sûrement plus court. Mais mon problème c'est que vous pouvez voir ce que j'ai déplacé à la troisième ligne de la fin ne s’exécute que si je repasse le script une seconde fois. C'est d'ailleurs pour cela que je l'ai mis sur les fichier .usfm et non .txt (pour que toutes les commandes sed ne s’exécute pas deux fois sur le même fichier). Je ne comprends pas ce comportement bizarre. J'ai utilisé le script il y a une semaine il avait très bien fonctionné du premier coup. L'avant dernière ligne elle, ne fonctionne pas du tout, elle avait pour ambition de supprimer le retour à la ligne après la ligne 2 dans le fichiers concernés.
Merci de votre aide.
Dernière modification par L'Africain (Le 12/11/2018, à 10:47)
Ubuntu-Unity 24.04 Alienware X/Lubuntu-Mate
"Donne à celui qui te demande…" Mt 5,42
Hors ligne
#2 Le 11/11/2018, à 10:46
- Postmortem
Re : [Résolu] Commande sed qui ne s'éxécute qu'au deuxième passage
Salut,
Pour joindre les lignes 2 et 3 :
sed -i.bak '2{N; s/\n/ /}' fichier
Sinon, pas besoin de ls dans tes for, il faut faire :
for FILE in *.txt
Faut éviter ls dans un script, ça ne peut que provoquer des soucis.
Et protège tes variables comme ceci : "$FILE"
Dernière modification par Postmortem (Le 11/11/2018, à 10:50)
Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »
Hors ligne
#3 Le 11/11/2018, à 17:17
- L'Africain
Re : [Résolu] Commande sed qui ne s'éxécute qu'au deuxième passage
Merci postmortem,
J'essaye ça et reviens...
Ubuntu-Unity 24.04 Alienware X/Lubuntu-Mate
"Donne à celui qui te demande…" Mt 5,42
Hors ligne
#4 Le 11/11/2018, à 18:29
- L'Africain
Re : [Résolu] Commande sed qui ne s'éxécute qu'au deuxième passage
Ok je viens de faire les modifications préconisées. Mais rien à faire ça ne fonctionne pas du premier coup?? Je viens aussi de découvrir un truc. Si je passe unoconv sur des docx pour en faire du txt, et que j’exécute le script, alors il n'y a pas de problème, mais si j'utilise unoconv sur des odt, je dois repasser le script deux fois??? Bizarre... J'ai en effet plus ou moins les même fichiers en docx et en odt.
J'ai mis les commandes qui posent problèmes dans un autre script que j'exécute avant le premier ça me fait la même chose. N'y a-t-il pas quelques chose dans cette commande qui se passe une première fois qui permet ensuite que ça fonctionne? (Je sais pas si je me fais bien comprendre )
Par contre pour les lignes c'est ok j'ai juste adapté car c'était pas la deuxième.
J'en profite pour signaler un problème annexe. Je voudrais mettre \s devant des titres qui se trouve la ligne au-dessus de la balise \c, comme ça:
Mon titre
\c
Pour que ça donne ça:
\s Mon titre
\c
J'ai fait ça:
sed -ir 's/^[A-Z].*$\c/\\s2 &/g' mon_fichier
mais ça marche pas?
Merci de votre aide!
Edit: Ah purée, je viens de trouver, si je sépare la partie qui supprime les lignes vides, ça fonctionne! Bon c'est pas trop grave...
Donc en gros je dois faire ça:
sed -i '/./!d' "$FILE"
sed -i '1i\\\id \n\\h \n\\toc1 \n\\toc2 \n\\toc3 \n\\mt1 ' "$FILE"
Dernière modification par L'Africain (Le 11/11/2018, à 18:32)
Ubuntu-Unity 24.04 Alienware X/Lubuntu-Mate
"Donne à celui qui te demande…" Mt 5,42
Hors ligne
#5 Le 12/11/2018, à 10:40
- L'Africain
Re : [Résolu] Commande sed qui ne s'éxécute qu'au deuxième passage
Bon je crois qu'on peut considérer cela comme résolu j'ouvre un autre fil pour l'autre question.
Ubuntu-Unity 24.04 Alienware X/Lubuntu-Mate
"Donne à celui qui te demande…" Mt 5,42
Hors ligne
#6 Le 12/11/2018, à 10:51
- Postmortem
Re : [Résolu] Commande sed qui ne s'éxécute qu'au deuxième passage
Bonjour,
#Supprime les lignes vide et ajoute "\id \mt1" à la première ligne sed -i '/./!d; 1i\\\id \n\\h \n\\toc1 \n\\toc2 \n\\toc3 \n\\mt1 ' $FILE
En fait, je n'avais pas fait attention mais ce sed ne fait rien si la première ligne est vide ; c'est normal ; la commande « d » de sed efface le buffer et passe direct à la ligne suivante, sans s'occuper des autres commandes (ici « 1i ... »).
Donc, si ta première ligne est vide, la commande « d » est exécutée, la ligne est donc supprimée et la commande « 1i ... » pas exécutée. Et elle n'est jamais exécutée vu que c'est une commande qui ne doit s'exécuter que sur la première ligne.
$ cat fic1.txt
ligne 1
ligne 2
$ cat fic2.txt # la ligne une de ce fichier est vide
ligne 2
$ sed '/./!d; 1i\\\id \n\\h \n\\toc1 \n\\toc2 \n\\toc3 \n\\mt1 ' fic1.txt
\id
\h
\toc1
\toc2
\toc3
\mt1
ligne 1
ligne 2
$ sed '/./!d; 1i\\\id \n\\h \n\\toc1 \n\\toc2 \n\\toc3 \n\\mt1 ' fic2.txt
ligne 2
Dernière modification par Postmortem (Le 12/11/2018, à 10:51)
Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »
Hors ligne
#7 Le 12/11/2018, à 10:53
- L'Africain
Re : [Résolu] Commande sed qui ne s'éxécute qu'au deuxième passage
Ok super aumoins je comprends! Merci pour le retour, donc je garde ma commande séparée. Sinon j'ai mis le nouveau post ic
Ubuntu-Unity 24.04 Alienware X/Lubuntu-Mate
"Donne à celui qui te demande…" Mt 5,42
Hors ligne