#1 Le 22/01/2013, à 18:15
- regivanx
Manipulation odt à la ligne de commande
Bonjour,
Je cherche à remplacer des chaînes de caractères dans une centaine de fichiers odt.
J'ai commencé d'écrire une ligne de commande, mais elle ne fonctionne pas encore :
find -name "*.odt" -exec mkdir -p {}.rep \; -exec unzip -o {} -d {}.rep/ \; -exec sed -i 's/tata/titi/g' {}.rep/content.xml \; -exec zip -r {}-corrige.odt . -i ./{}.rep/* \;
Je bloque au niveau de la recompression zip qui archive le dossier "{}.rep" et non l'intérieur du dossier. Résultat : le nouveau fichier odt est illisible.
D'autre part, j'imagine que ma commande n'est pas optimale et qu'on pourrait faire la même chose avec des tubes.
Des suggestions ?
Hors ligne
#2 Le 22/01/2013, à 19:34
- nesthib
Re : Manipulation odt à la ligne de commande
En présumant que tous les fichiers odt sont dans le répertoire courant :
for file in *.odt
do
unzip "${file}" -d working_dir
cd working_dir
sed -i 's/tata/titi/g' content.xml
zip -r "../${file%.odt}_substitution.odt" .
cd ..
rm -r working_dir
done
Attention ! content.xml est un fichier XML, remplacer une chaîne de caractère sans faire attention peut avoir des effets indésirables (ex. suppression des balises).
GUL Bordeaux : Giroll – Services libres : TdCT.org
Hide in your shell, scripts & astuces : applications dans un tunnel – smart wget – trouver des pdf – install. auto de paquets – sauvegarde auto – ♥ awk
⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn
Hors ligne
#3 Le 01/02/2013, à 22:29
- regivanx
Re : Manipulation odt à la ligne de commande
Désolé pour le retard, j'étais indisponible.
Merci de ta réponse nesthib, cela m'a permis de me réorienter vers le concept de "variable" que je ne connaissais pas.
Le but est justement de modifier les balises de content.xml.
Voici mon nouveau script :
#!/bin/bash
#trouver le chemin des fichiers
find -name "*.odt" | while read line;
#création de la variable (?)
do var[$i]=$line;
echo "${var[$i]}";
#création du répertoire temporaire contenant les fichiers de l'odt
mkdir "${var[$i]}".rep;
unzip -o "${var[$i]}" -d "${var[$i]}".rep/ ;
cd "${var[$i]}".rep/ ;
#test de remplacement des chaines de caractères
sed -i 's/text:h text:style-name="Heading_20_4" text:outline-level="4"/youplaboum/g' content.xml ;
#recompression en .zip (pas besoin d'odt dans l'immédiat)
zip -r "${var[$i]}".zip * ;
mv "${var[$i]}".zip .. ;
cd .. ;
#suppression du répertoire temporaire
rm -r "${var[$i]}".rep ;
#dernière opération sur la variable (?)
i=$((i+1));
done
(J'ai mis un point d'interrogation là où j'ai copié-collé un code sans le comprendre)
Reste à maîtriser le fonctionnement de sed et des expressions rationnelles, ainsi que la structure du fichier content.xml.
Je vous explique la manœuvre : ces fichiers odt sont destinés à être convertis en xhtml via le programme writer2latex (en ligne de commande).
Or la conversion ne se passe pas très bien, on a :
titre principal <p> (pas bon)
titre 1 <h1>
titre 2 <h2>
titre 3 <h3>
titre 4 <h4>
titre 5 <h5>
etc.
du coup le but est de tout décaler :
titre principal en titre 1 (converti en <h1> par w2l)
titre 1 en titre 2 (converti en <h2> par w2l)
titre 2 en titre 3 (converti en <h3> par w2l)
etc.
Je vous tiendrai au courant des suites de mon projet.
Je suis toujours ouvert aux suggestions.
Hors ligne