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/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 18.04 LDLC (clevo) 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 18.04 LDLC (clevo) 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 smile )
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 18.04 LDLC (clevo) 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 18.04 LDLC (clevo) 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,

L'Africain a écrit :
#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 18.04 LDLC (clevo) X/Lubuntu-Mate
"Donne à celui qui te demande…" Mt 5,42

Hors ligne