Tuesday, November 5, 2013

Outils de manipulation de texte

 Exercice 1:

Am�liorez le script pr�c�dent pour qu�il fasse son travail deux fois par minute.

Solution :

Le script checkmail est modifi� de la fa�on suivante :
#!/bin/sh
while true ; do
awk f chkmail.awk /var/spool/mail/$USER
sleep 30
done
Et il est maintenant lanc� en t�che de fond :
kyle> ./checkmail &

Exercice 2:

Am�liorer le script pr�c�dent pour qu�il reste silencieux si aucun message n�est
arriv� dans la p�riode qui pr�c�de.

Solution :

Le script checkmail est modifi� de la fa�on suivante :
#! /bin/sh
MABOITE=/var/spool/mail/$USER
STAMP=/tmp/timestamp.$USER
# ce fichier sert a connaitre l'instant auquel j'ai
# remarque une modification de ma boite aux lettres
rm �f $STAMP
while true ; do
if [ s $MABOITE ] ; then
if [ $MABOITE �nt $STAMP ] ; then
clear;
awk f chkmail.awk $MABOITE
touch $STAMP
fi
fi
sleep 30
done

Exercice 3:

Si vous travaillez dans l�environnement X11, lancez ce script en background dans
une petite fen�tre dans un coin de votre �cran. Il est sup�rieur au programme xbiff
� deux points de vue :
- vous savez si le message qui vient d�arriver m�rite le d�rangement ;
- vous avez la satisfaction de l�avoir fait vous-m�me.

Solution :

kyle> xterm �geometry 60x7 0+0 +sb e ./checkmail &

Exercice 4:

�crire un script qui lit un message sur son entr�e standard et recopie :
- l�en-t�te du message dans le fichier "./_header" ;
- le corps du message dans le fichier "./_body".
Un tel script est l�outil de base permettant d�automatiser le traitement des messages
� l�arriv�e. �crire une solution sed et une solution awk.

Solution :

Le fichier splitmail.sed contient :
#n
1,/^$/w _header
/^$/,$ {
 /^$/d
w _body
}
La commande sed traitant le message est :
kyle> cat message | sed �f splitmail.sed
Le fichier splitmail.awk contient :
BEGIN {FICH = "_header"}
/^$/ {FICH = "_body"}
{print > FICH }
La commande awk traitant le message est :
kyle> cat message | awk �f splitmail.awk

Exercice 5:

Chercher un motif dans un fichier avec egrep, c�est facile :
egrep 'ere' fichier
Remplacer une cha�ne qui v�rifie une expression r�guli�re par une nouvelle cha�ne,
c�est facile aussi, mais moins, et c�est surtout long � taper, et il faut rediriger, ... Ce
qu�il faudrait, c�est un sed simplifi� "� la grep", nomm� remplace, � utiliser dans
les cas tous simples, comme par exemple :
remplace 'pays' 'paysage' *.txt
Ce qui signifie : dans tous les fichiers d�extension .txt, remplacer toute occurrence
de la cha�ne pays par paysage.
Bien s�r, comme pour egrep, le premier argument est une expression r�guli�re.

Solution :

#!/bin/bash
if [ $# lt 3 ] ; then # Il faut au moins trois arguments
echo erreur : remplace 'ere' 'nchaine' file..
exit 1
fi
ERE="$1" # le premier arg est l'expression
REPLACE="$2" # le deuxieme arg est la nouvelle chaine
SEP='%' # nous utiliserons % comme separateur
# (le caractere / pourra apparaitre dans l'expression)
shift; shift
# maintenant, $1 contient le premier nom de fichier
# faire une boucle sur tous les fichiers passes
# en arguments
while [ z$1 != z ] # teste si $1 n'est pas vide
# (encore un fichier a traiter?)
do
if [ f $1 ] ; then # $1 est un fichier
sed "s${SEP}${ERE}${SEP}${REPLACE}${SEP}g" $1 \
>/tmp/replace.$$
# le resultat est dirige vers un fichier
# temporaire qui est recopie sur le fichier
# d'origine si sed a effectue au moins une modification
[ $? = 0 ] && cat /tmp/replace.$$ >$1
else
echo $1 n\'est pas un fichier, ignore
# $1 peut etre un repertoire
fi
shift # pour passer au suivant, decaler les
# arguments d'un pas vers la gauche
done # et passer au suivant : fin de la boucle.
rm f /tmp/replace.$$
# faire le menage quand tout est fini

No comments:

Post a Comment