Contenu | Rechercher | Menus

Annonce

Si vous rencontrez des soucis à rester connecté sur le forum (ou si vous avez perdu votre mot de passe) déconnectez-vous et reconnectez-vous depuis cette page, en cochant la case "Me connecter automatiquement lors de mes prochaines visites".
Test de l'ISO d'Ubuntu francophone : nous avons besoin de testeurs pour la version francophone d'Ubuntu 14.04. Liens et informations ici.

Attention, une faille de sécurité dans bash a récemment été rapportée, il est recommandé de mettre à jour son système (plus de détails) *** mise à jour 12/10/2014 ***

#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

Haut de page ↑