Contenu | Rechercher | Menus

Annonce

Le forum a une nouvelle maison !
Le forum a été migré sur un nouvel hébergement. Si jamais vous trouvez le moindre problème, n'hésitez pas à nous en faire part !
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".

#1 Le 22/01/2013, à 17:15

regivanx
Membre

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, à 18:34

nesthib
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn

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).

Hors ligne

#3 Le 01/02/2013, à 21:29

regivanx
Membre

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