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 06/01/2015, à 14:31

L'Africain

(résolu) mettre texte devant chiffre et retour chariot avec sed

Bonjour,
Je dois convertir un certain nombres de fichier texte en format usfm pour ensuite les convertir en osis.
Bref mon texte doit ressembler à ça:

\id TOB
\mt1 Tobie
\c 1
\p
\v 1 Livre des actes de .....
\v 22 Acte...de plus c'était mon neveu, il était de ma parenté.
\c 2
\p
\v 1 Sous le règne d'Asarhaddon,

Il ressemble pour l'instant à ça:

Tobie

1
1 Livre des actes de T...
plus c'était mon neveu, il était de ma parenté.
...
2
1 Sous le règne d'Asa

Avec mon script sed que voici :

#Supprime les lignes vide et ajoute "\id TOB" à la première ligne,
find . -name "*.txt" -exec sed -i '/./!d; 1i\\\id TOB\n\\mt1' {} \;
#Ajoute \v devant chaque ligne commençant par un chiffre suivit d'un espace et de texte,
find . -name "*.txt" -exec sed -i 's/^[0-9] [a-z]*/\\v &/g' {} \;
#Ajout "\v " devant chaque ligne commençant par deux chiffres suivit d'un espace et de texte,
find . -name "*.txt" -exec sed -i 's/^[0-9][0-9] [a-z]*/\\v &/g' {} \;
#Ajoute "\c\n\p" devant chaque ligne correspondant à un chiffre suivit d'un retour à la ligne,
find . -name "*.txt" -exec sed -i 's/^[0-9]\n/\\c &\n\\p/g' {} \;

J'obtiens ça:

\id TOB
\mt1
Tobie
\c 1
\p
\v 1 Livre des actes de .....

La dernière commande ne marche pas bien, elle ne semble pas lire le retour à la ligne si je mets ^[0-9]\n, mais si je ne met pas le \n (comme dans le résultat) s'il y a deux chiffres il va faire la substitution après chaque chiffre, exemple pour le chiffre 16 ça donne:

\c 1
\p6

aulieu de:

\c 16
\p

J'ai un problème aussi pour mettre \mt1 devant le contenue de la deuxième ligne ou bien fusionner les deux lignes \mt1 Tobie.
Merci pour votre aide!

Dernière modification par L'Africain (Le 12/01/2015, à 11:32)


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

Hors ligne

#2 Le 08/01/2015, à 16:22

soshy

Re : (résolu) mettre texte devant chiffre et retour chariot avec sed

Salut,

La dernière commande ne marche pas bien, elle ne semble pas lire le retour à la ligne si je mets ^[0-9]\n, mais si je ne met pas le \n (comme dans le résultat) s'il y a deux chiffres il va faire la substitution après chaque chiffre, exemple pour le chiffre 16 ça donne:

essaye avec : s/^[0-9]+\n/\\c &\n\\p/g

Et de fait, tu peux corriger :

#Ajoute "\c\n\p" devant chaque ligne correspondant à un chiffre suivit d'un retour à la ligne, 

en

#Ajoute "\c\n\p" devant chaque ligne correspondant à un nombre suivit d'un retour à la ligne,

il serait peut être mieux de faire comme ça :

#!/bin/bash

# pour chaque fichier dans ls *.txt
for FILE in `ls *.txt` ; do
  sed -i '/./!d; 1i\\\id TOB\n\\mt1' $FILE
  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]+\n/\\c &\n\\p/g' $FILE

  # de quoi ramener Tobie sur la ligne mt1 (si il n'y a qu'une seule ligne \mt1)
  sed -i 's/\\mt1[ ]*\n/\\mt1 /g' $FILE
done

Je ne peux pas tester ce que je viens d'écrire, mais on devrait pas être loin de la solution.

Dernière modification par soshy (Le 08/01/2015, à 16:54)

Hors ligne

#3 Le 08/01/2015, à 21:11

L'Africain

Re : (résolu) mettre texte devant chiffre et retour chariot avec sed

Merci Je vais essayer ça parce que c'est plus propre, mais entre temps j'ai réussi à bricoler quelque-chose...


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

Hors ligne

#4 Le 12/01/2015, à 11:14

L'Africain

Re : (résolu) mettre texte devant chiffre et retour chariot avec sed

Voilà j'ai réussi, le problème semble-t-il venait du bom  qui s'était infiltré dans mon texte après conversion en utf8; voilà le script final:

#!/bin/bash

# pour chaque fichier dans ls *.txt
for FILE in `ls *.txt` ; do
#Comence par mettre à la ligne chaque verset
  sed -i 's/ [0-9][0-9] /\n&/g' $FILE
  sed -i 's/ [0-9] /\n&/g' $FILE
#Supprime l'espace en début de ligne
  sed -i 's/^[ ]*//g' $FILE
#Supprime les lignes vide et ajoute "\id TOB \mt1" à la première ligne,
  sed -i '/./!d; 1i\\\id TOB\n\\mt1 ' $FILE
#Colle la ligne 2 et 3
  sed -i '/\\mt1$/N; s/\n/ /' $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
#ajoute \c devant chaque ligne commencant par deux chiffre
  sed -i 's/^[0-9]+\n/\\c &\n\\p/g' $FILE
  rename 's/txt/sfm/g' $FILE
  # Autre solution pour mettre \mt1 devant les noms des livres bibliques, dans ce cas modifier la ligne qui ajoute \id TOB
  #sed -i 's/^[A-Z]/\\mt1 &/g' $FILE
  #sed -i 's/^[1-2] [A-Z]/\\mt1 &/g' $FILE
done

Merci pour ton aide


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

Hors ligne