Blog de Robert Sebille


Vers mon curriculum vitae - Conception

Accueil > Technique > Informatique > Shell bash > odfgrep, recherche un motif dans des documents ODF.

Robert Sebille

odfgrep, recherche un motif dans des documents ODF.

lundi 24 août 2015, par Robert

odfgrep est un script bash qui recherche récursivement la présence d’un motif dans des documents ODF : .odt, .ods, .odp.
(NB : Les fichiers avec des espaces dans les noms sont gérés.)

Dépendances

L’éditeur de flux "sed" et le validateur / correcteur html "tidy" doivent être installés et dans le chemin par défaut. odfgrep détecte et signale si il ne trouve pas ses dépendances.

Options disponibles

        Usage: odfgrep [-i|-E|-iE] <motif> [<chemin>]
        Usage: odfgrep [-h|--help] # Aide
        Usage: odfgrep -v|-V|--version # Version

        Cherche récursivement la présence de <motif> dans des documents ODF: .odt, .ods, .odp.
        -i         Recherche insensible à la casse.
        -E         Recherche sur expression rationnelle étendue (-E est spécifé par POSIX).
        Si <motif> comporte des espaces ou des caractères spéciaux, il doit être mis entre guillemets.
        Si <chemin> n'est pas donné, la recherche débute dans le répertoire courant.

Version

        Version 0.4 - Licence GNU GPL 3
        Auteur: Robert Sebille 2015.

Code source

#!/bin/bash

###############################################################################
#   odfgrep : Cherche récursivement la présence de <motif> dans des documents #
#   ODF: .odt, .ods, .odp.                                                    #
###############################################################################
#   Copyright (C) 2015 Robert Sebille.                                        #
#                                                                             #
#   This program is free software: you can redistribute it and/or modify      #
#   it under the terms of the GNU General Public License as published by      #
#   the Free Software Foundation, either version 3 of the License, or         #
#   (at your option) any later version.                                       #
#                                                                             #
#   This program is distributed in the hope that it will be useful,           #
#   but WITHOUT ANY WARRANTY; without even the implied warranty of            #
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the             #
#   GNU General Public License for more details.                              #
#                                                                             #
#   You should have received a copy of the GNU General Public License         #
#   along with this program.  If not, see <http://www.gnu.org/licenses/>.     #
#                                                                             #
###############################################################################

version() {
   echo -e "\n\tVersion 0.4 - Licence GNU GPL 3";
   echo -e "\tAuteur: Robert Sebille 2015.\n";
   exit;
}

help() {
   echo -e "\n\tUsage: odfgrep [-i|-E|-iE] <motif> [<chemin>]";
   echo -e "\tUsage: odfgrep [-h|--help] # Aide";
   echo -e "\tUsage: odfgrep -v|-V|--version # Version\n";
   echo -e "\tCherche récursivement la présence de <motif> dans des documents ODF: .odt, .ods, .odp.";
   echo -e "\t-i\t Recherche insensible à la casse.";
   echo -e "\t-E\t Recherche sur expression rationnelle étendue (-E est spécifé par POSIX).";
   echo -e "\tSi <motif> comporte des espaces ou des caractères spéciaux, il doit être mis entre guillemets.";
   echo -e "\tSi <chemin> n'est pas donné, la recherche débute dans le répertoire courant.\n";
   exit;
}

arg_manque() {
   echo -e "\n\tIl manque l'argument $1";
   help;
}

if [ "$#" -eq "0" -o "$1" == "-h" -o "$1" == "--help" ]; then
   help
fi;

if [ "$1" == "-v" -o "$1" == "--version" -o "$1" == "-V" ]; then
   version
fi;

grepOptions="";
chemin="./";
if [ "$1" == "-i" -o "$1" == "-E" -o "$1" == "-iE" -o "$1" == "-Ei" ]; then
   grepOptions=$1;
   if test -z "$2"; then arg_manque "<motif>"; else motif="$2"; fi;
   if test -n "$3"; then chemin=$3; fi;
else
   if test -z "$1"; then arg_manque "<motif>"; else motif="$1"; fi;
   if test -n "$2"; then chemin=$2; fi;
fi;

tidyOk=$(which tidy);
if [ "x$tidyOk" == "x" ]; then
   echo -e "\n\tIl manque une dépendance. L'utilitaire tidy n'est pas installé.";
   echo -e "\tVeuillez exécuter 'sudo apt-get install tidy' ou 'sudo rpm -i tidy' suivant votre système.\n";
   exit;
fi;

sedOk=$(which sed);
if [ "x$sedOk" == "x" ]; then
   echo -e "\n\tIl manque une dépendance. L'utilitaire sed n'est pas installé.";
   echo -e "\tVeuillez exécuter 'sudo apt-get install sed' ou 'sudo rpm -i sed' suivant votre système.\n";
   exit;
fi;

echo -e "---- Début recherche ----";
let i=0;
#for fichier in `find "$chemin" -name "*.odt" -o -name "*.ods" -o -name "*.odp"`; do
# Ci-dessus, probleme de separateur boucle for et espace dans les noms de fichiers
# http://www.developpez.net/forums/d849889/general-developpement/programmation-systeme/linux/bash-boucle-noms-fichiers-espaces/
find "$chemin" -name "*.odt" -o -name "*.ods" -o -name "*.odp" | while read fichier; do
   # inspiré de http://www.techrepublic.com/blog/linux-and-open-source/how-to-search-for-text-inside-many-opendocument-files/
   resultat=$(unzip -p "$fichier" content.xml | tidy -q -xml 2> /dev/null | grep $grepOptions "$motif");
   if [ $? -eq 0 ]; then resultat=$(echo $resultat | sed 's/<[^>]*>//g'); ((i++)); echo "$i) $resultat trouvé dans $fichier."; fi;
done
echo -e "----- Fin recherche -----";

Le script à télécharger

odfgrep
Version 0.4 - GNU GPL 3

Un message, un commentaire ?

modération a priori

Ce forum est modéré a priori : votre contribution n’apparaîtra qu’après avoir été validée par un administrateur du site.

Qui êtes-vous ?

Votre message

Pour créer des paragraphes, laissez simplement des lignes vides.