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
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 -----";