spell
, il est souhaitable de ne pas faire
passer les commandes avec, sous peine d'obtenir une avalanche de mots
inconnus de spell
.
On cherche donc à faire (en Perl) un filtre list
qui
puisse extraire certaines lignes du fichier.
On spécifie les lignes à extraire en activant le filtre par un
mot-clef avant, et en le désactivant par un autre mot-clef.
On décide que ces mots-clef soient respectivement
"filter list on
" et "filter list off
".
Par exemple, si le fichier toto
contient
#! /bin/sh if [ $# != 1 ] then echo "un seul argument svp" exit 1 fi cat >> $1 <<END # filter list on Perl is a language optimized for scanning arbitrary text files, extracting information from those text files, and printing reports based on that information. It's also a good language for many system management tasks. The language is intended to be practical (easy to use, efficient, complete) rather than beautiful (tiny, elegant, minimal). END # filter list off exit 0la commande
list toto
donne en sortie standard
Perl is a language optimized for scanning arbitrary text files, extracting information from those text files, and printing reports based on that information. It's also a good language for many system management tasks. The language is intended to be practical (easy to use, efficient, complete) rather than beautiful (tiny, elegant, minimal). ENDet l'on peut faire
list toto | spell
.
accent
qui convertie les différents
formats de caractères accentués.
Par exemple,
accent tex <file1> iso <file2>
<file2>
le fichier <file1>
en remplaçant "\'e
" par "é
", ...
Voici une liste des substitutions à faire.
tex | iso | epelle | html |
\'e | é | e' | é |
\`e | è | e` | è |
\^e | ê | e^ | ê |
\`a | à | a` | à |
\^a | â | a^ | â |
\^o | ô | o^ | ô |
\`u | ù | u` | ù |
\"u | ü | u" | ü |
\^{\i} | î | i^ | î |
\"{\i} | ï | i" | ï |
\c{c} | ç | c, | ç |
{\oe} | oe | oe | oe |
{\ae} | æ | ae | æ |
split
telle que
split totoeffectue les instructions suivantes.
toto
, et le parcours ligne-par-ligne
jusqu'à trouver le mot-clef "split control parameters
".
split control
parameters<delimiter><commands><delimiter><end of line>
où <delimiter>
est un caractère quelconque
utilisé comme délimiteur, <commands>
est
une chaîne de caractères (éventuellement avec des sauts
à la ligne) ne contenant pas le délimiteur, et
end of line>
est la fin de la ligne qui contient le
délimiteur.
La chaîne de caractères <commands>
est
interprétée comme une suite de chaînes de caractères
(séparés par des espaces ou des passages à la ligne).
Chaque chaîne représente une commande.
Les commandes sont éxécutées (voir la liste des
commandes plus bas).
A la fin, le programme doit obtenir une table de mots-clef et de fichiers.
A chaque mot-clef doit correspondre un fichier.
La commande continue de lire la suite du fichier ligne-par-ligne en
les recopiant dans une liste de fichiers.
A chaque fois qu'une ligne contenant au moins un mot-clef est rencontré,
cette ligne n'est pas recopiée, mais les lignes suivantes sont
recopiées à nouveau dans la liste de fichiers correspondant aux
mots-clef de la ligne.
Voici la liste des commandes.
ignore <str>
Dans la suite de la liste <commands>
, ignore les
chaînes égales à <str>
.
thisfile <character>
Dans la suite de la liste <commands>
, remplace dans les
noms de fichier les occurrences du caractère
<character>
par le nom du fichier traité.
keyword <keyword> <file>
Crée un mot-clef <keyword>
associé au nom
de fichier <file>
(éventuellement substitué).
default <keyword1> [<keyword2> [...]]
Recopie les premières lignes du fichier, ainsi que les suivantes
(jusu'aux prochains mots-clef) dans la liste des fichiers correspondant aux
mots-clefs suivant.
(Cette commande doit être la dernière.)
Par exemple, si exo1
contient
#! /bin/perl
# split control parameters"ignore #
# thisfile @
# keyword split_ignore /dev/null
# keyword split_exo_fr @_fr.html
# keyword split_cor @_cor
# keyword split_exo_en @_en.html
# default split_cor
# "
while ($line=<>) {
print $line;
}
exit 0;
# split_exo_fr split_exo_en
<html><head></head><body>
# split_exo_fr
Faire un filtre analogue à <code>cat</code> qui recopie
l'entrée standard dans la sortie standard.
</body></html>
# split_exo_en
Write a Perl filter which as <code>cat</code> copies the standard
input into the standard output.
# split_exo_fr split_exo_en
</body></html>
la commande va créer trois fichiers:
exo1_fr.html
, exo1_en.html
et
exo1_cor
.
A la fin, exo1_fr.html
contientdra
<html><head></head><body>
Faire un filtre analogue à <code>cat</code> qui recopie
l'entrée standard dans la sortie standard.
</body></html>
exo1_en.html
contientdra
<html><head></head><body>
Write a Perl filter which as <code>cat</code> copies the standard
input into the standard output.
</body></html>
et exo1_cor
contientdra
#! /bin/perl
while ($line=<>) {
print $line;
}
exit 0;
[corrigé]
[solution de JB]