Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Amélioration d'un script

8 réponses
Avatar
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

8 réponses

Avatar
Ph. Ivaldi
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/

Avatar
Olivier V

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

Avatar
Ph. Ivaldi
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/


Avatar
dominique

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

Avatar
Olivier V
Merci pour toutes les précisions.

Olivier V
Avatar
Fabien LE LEZ
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).

Avatar
dominique
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


Avatar
Fabien LE LEZ
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