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
Suivant
« Précédent
Précédent
Suivant »

ConversionConversion EmoticonEmoticon

Remarque : Seul un membre de ce blog est autorisé à enregistrer un commentaire.