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
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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/
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/
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
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
- 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
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
- 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}]
- 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 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' 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".
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
'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".
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
'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".
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
De rien; j'espère ne pas avoir dit de trop grosses bêtises. -- Philippe Ivaldi. http://piprim.tuxfamily.org/
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
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
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
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).
On Tue, 15 May 2007 07:22:14 +0200, dominique <zzz@aol.com>:
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).
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
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
On Tue, 15 May 2007 07:22:14 +0200, dominique <zzz@aol.com>:
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
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
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
On Wed, 16 May 2007 06:37:22 +0200, dominique <zzz@aol.com>:
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
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