Amélioration d'un script

Le
Olivier V
Bonjour,

Ph. Ivaldi m'avait gentillement conçu il y a quelques jours un script
parfaitement fonctionnel dont le but est de tester si un fichier contient
la chaîne "begin{pspicture}".

Je souhaiterais étendre le script en faisant également tester si le fichier
contient une chaîne de la forme "includegraphics{******.eps}" où *****
désigne n'importe quelle chaîne de caractère (ou à défaut simplement ".eps"
si le test précédent est trop compliqué).

Comment faire ?

Merci d'avance pour votre aide.

Voici le script actuel

#!/bin/sh
if cat "$1" |
awk -v FS="^Z" "/\begin{document}/,/\end{document}/" |
grep -q "^ *\begin{pspicture}"; then
touch /tmp/contientpspicture
else
rm -f /tmp/contientpspicture
fi

Olivier V
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Ph. Ivaldi
Le #1887914
Le 13 mai 2007, Olivier V écrivit :

Bonjour,


Bonjour,


Je souhaiterais étendre le script en faisant également tester si le
fichier contient une chaîne de la forme "includegraphics{******.eps}"


Je suppose que tu veux savoir si le fichier contient begin{pspicture}
OU includegraphics{*.eps}

où ***** désigne n'importe quelle chaîne de caractère (ou à défaut
simplement ".eps" si le test précédent est trop compliqué).

Comment faire ?


#!/bin/sh

if cat "$1" |
awk -v FS="^Z" "/\begin{document}/,/\end{document}/" |
grep -Eq "(^ *\begin{pspicture})|(\includegraphics{.*.eps})"; then
touch /tmp/contientpspicture
else # on teste l'existence avant de supprimer...
[[ -e /tmp/contientpspicture ]] && rm -f /tmp/contientpspicture
fi


Merci d'avance pour votre aide.


Avec plaisir.
Peut-être faut-il aussi tester si le début de la ligne contenant le
includegraphics n'est pas un "%" ?
--
Philippe Ivaldi.
http://piprim.tuxfamily.org/

Olivier V
Le #1885458

Peut-être faut-il aussi tester si le début de la ligne contenant le
includegraphics n'est pas un "%" ?


Oui ; en fait on peut commencer par ignorer globalement toutes les lignes
commençant par % pour tous les tests éventuels.

Encore une amélioration en perspective.


Je vais aussi essayer de comprendre un peu tout ça.
J'ai regardé le man et voilà ce que j'ai compris ... ou pas :

if cat "$1" |


La commande cat récupère le fichier et l'envoie à awk

awk -v FS="^Z" "/\begin{document}/,/\end{document}/" |


- C'est quoi le -v FS et en particuler "^Z" ?
- "/bla,/blo/" récupère ce qui est entre les chaînes bla et blo
- le premier slash indique que ce qu'il faut charcher est une chaîne de
caractère
- les deux \ suivants donnent en fait accès "au vrai backslash"

puis c'est envoyé à grep

grep -Eq "(^ *\begin{pspicture})|(\includegraphics{.*.eps})"; then


- E ?
- q : mode silencieux (ne signale pas d'erreur et n'écrit rien en console)
- ^ * ?
- puis \ : chaîne de caractère commençant par un vrai backslash (comme
awk)
- | : OR logique
- .*.eps ?

Mais sous quelle forme grep renvoie-t-il une réponse utilisable par if ?
En effet en enlevant le "q", la réponse est le la forme :
[includegraphics{DS2006_im1.eps}]

Merci encore pour vos éclaircissements.

Olivier V

Ph. Ivaldi
Le #1885404
Le 14 mai 2007, Olivier V écrivit :


Peut-être faut-il aussi tester si le début de la ligne contenant le
includegraphics n'est pas un "%" ?


Oui ; en fait on peut commencer par ignorer globalement toutes les
lignes commençant par % pour tous les tests éventuels.

Encore une amélioration en perspective.


Facile ;-)
Remplacer 'cat $1' par: sed -r 's/([^]|^)%.*//g' $1

Ça évite en plus de ne pas prendre un % pour un %.


Je vais aussi essayer de comprendre un peu tout ça.
J'ai regardé le man et voilà ce que j'ai compris ... ou pas :

if cat "$1" |


La commande cat récupère le fichier et l'envoie à awk


Oui. En fait c'est inutile:
awk .... $1 est mieux.


awk -v FS="^Z" "/\begin{document}/,/\end{document}/" |


- C'est quoi le -v FS et en particuler "^Z" ?


'awk' voit son entrée comme un ensemble d'enregistrements séparés par
un saut de ligne par défaut (variable RS) et chaque enregistrement est
un ensemble de champs séparés par un espace par défaut (variable FS).
L'option -v FS="^Z" redéfinit donc le séparateur de champ par un truc
qui, j'espère, n'existe pas dans ton fichier (^Z n'est d'ailleurs pas
très bien choisi si tu commences une ligne par un Z); ainsi chaque
enregistrement ne contient qu'un seul champ: la ligne.

À quoi ça sert ici ?
Ben... je viens de me rendre compte que ça sert à rien!

- "/bla,/blo/" récupère ce qui est entre les chaînes bla et blo - le
premier slash indique que ce qu'il faut charcher est une chaîne de
caractère - les deux \ suivants donnent en fait accès "au vrai
backslash"


Je ne le vois pas ainsi...
Il me *semble* qu'en bash, dans une chaîne, n'est pas un caractère
mais un modificateur (les caractères 'déspécifiés' dit 'man echo').
"n" par exemple est un saut de ligne (echo -e "totontiti").
Pour 'awk' c'est idem:
Si tu passes à 'awk' la chaîne "\n" il recevra "n" qu'il interprétera
à son tour par un saut de ligne.
Du coup, si tu passes "\n", awk reçoit "\n" et l'interprète comme "le
caractère suivi de n".

C'est ce que j'ai cru comprendre...


puis c'est envoyé à grep

grep -Eq "(^ *\begin{pspicture})|(\includegraphics{.*.eps})";


- E


Pour utiliser les expressions régulières étendues.

- q : mode silencieux (ne signale pas d'erreur et n'écrit rien en
console)

^ *


toute ligne qui commence par des espaces ou rien.
^ signifie 'ligne commence par' (entre des [] c'est la négation)
I* signifie aucun I ou des I.

- puis \ : chaîne de caractère commençant par un
vrai backslash (comme awk) - | : OR logique

.*.eps ?


le point signifie "un caractère quelconque", donc .* signifie autant de
caractères que l'on veux.
. pour "échapper" le sens de .

Mais sous quelle forme grep renvoie-t-il une réponse utilisable par
if ? En effet en enlevant le "q", la réponse est le la forme :
[includegraphics{DS2006_im1.eps}]


Quand 'grep' ne trouve pas le motif donné il sort avec un code de
sortie d'erreur de 1, 0 sinon.

Essaye ça:

$ grep -q "zigouigoui" essai.tex
$ echo $? #renvoie le code de sortie de la dernière commande

puis

grep -q "document" essai.tex
$ echo $?

du coup:
$ grep -q "document" essai.tex && echo "j'ai trouvé"

va écrire "j'ai trouvé" quand..., rien sinon.

Merci encore pour vos éclaircissements.


De rien; j'espère ne pas avoir dit de trop grosses bêtises.
--
Philippe Ivaldi.
http://piprim.tuxfamily.org/


dominique
Le #1885403

Facile ;-)
Remplacer 'cat $1' par: sed -r 's/([^]|^)%.*//g' $1


J'adore quand c'est facile :-))
Et puis le français est une si belle langue.
Bref, les expressions régulières restent encore bien mystérieuses pour
moi et pourtant j'essaye de me soigner...
Bonne journée à tous,
Dominique

Olivier V
Le #1887902
Merci pour toutes les précisions.

Olivier V
Fabien LE LEZ
Le #1887892
On Tue, 15 May 2007 07:22:14 +0200, dominique
Bref, les expressions régulières restent encore bien mystérieuses pour moi


Histoire de te compliquer un peu la tâche :

- Il me semble que "expressions régulières" est un faux ami ("regular
expressions" se traduit par "expressions rationnelles"). Sauf que pour
le coup, si tu traduis correctement, personne ne te comprend :-(

- Il y a deux types d'expressions régulières : les expressions "façon
Perl" et les "POSIX" (Je me trompe peut-être dans les termes).

dominique
Le #1887880
On Tue, 15 May 2007 07:22:14 +0200, dominique
Bref, les expressions régulières restent encore bien mystérieuses pour moi


Histoire de te compliquer un peu la tâche :


Était-ce bien nécessaire ?


- Il me semble que "expressions régulières" est un faux ami ("regular
expressions" se traduit par "expressions rationnelles"). Sauf que pour
le coup, si tu traduis correctement, personne ne te comprend :-(



À dire vrai, « expression rationnelle » me paraît plus parlant que «
régulière ».

- Il y a deux types d'expressions régulières : les expressions "façon
Perl" et les "POSIX" (Je me trompe peut-être dans les termes).



Ça, je savais. Je ne sais pas trop où se situent les différences mais je
savais qu'il y avait une nuance :-)
Bonne journée à toi,
Dominique


Fabien LE LEZ
Le #1887871
On Wed, 16 May 2007 06:37:22 +0200, dominique
Histoire de te compliquer un peu la tâche :


Était-ce bien nécessaire ?


C'est juste pour te prévenir que franchir la première colline te
permettra d'apercevoir, au loin, d'autres montagnes, encore plus
hautes que les précédentes :-p


Publicité
Poster une réponse
Anonyme