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 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 : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde 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