Solution des exercices proposés Fichier

Transcription

Solution des exercices proposés Fichier
GPA435 Systèmes d’exploitation et programmation de système
Exercices : Cours #8
Message aux etudiants
I
l y a bien des chemins qui mènent à Rome (ou Longueuil). Les solutions données ici ne représentent
que l’un de ces chemins. Ainsi, il ne faut les considérer comme les meilleures solutions. De plus, il est
primordial de faire les exercices proposés dans le document obligatoire « Notes de base et exercices,
édition 2001 » (disponible sur la page « Informations » du site Moodle de GPA435). L’étude de ce
document obligatoire est nécessaire à la réussite de ce cours.
Solution des exercices du cours #8
Voici un fichier de données nommé db_nom.out :
1|Page
1. Utiliser tr et autres filtres pour montrer les caractères invisibles séparant les champs : espace  +,
tab  *.
Non sed
cat db_nom.out | tr ' \t' '+*'
sed
cat db_nom.out | sed 's/ /+/g' | sed 's/\t/\*/g'
2. Éliminer les espaces ou tab au début de chacune des lignes
Note : Il n’y a pas de façon directe pour réaliser cette tâche.
Non sed
Première solution : lire ligne par ligne et utiliser la commande echo pour débarrasser les caractères
espace et tab au début d’une ligne.
while read VAR; do echo "$VAR"; done < db_nom.out
2|Page
Deuxième solution : lire ligne par ligne et utiliser l’expansion des paramètres bash pour débarrasser
les caractères espace et tab au début d’une ligne. L’expansion des paramètres est expliquée bash
while read VAR; do echo "${VAR##+([[:blank:]])}"; done < db_nom.out
Explication: le format général de l’expansion des paramètres utilisée dans la ligne de commande cihaut est ${parameter##pattern}. Cette expansion consiste à enlever le pattern de la variable
parameter à partir du début de son contenu. De plus, les symboles ## signifie trouver le pattern le
plus long à enlever. La classe de caractères [[:blank:]] représente les caractères espace et tab. La
classe :blank: est placée entre double crochets pour être compatible avec les caractères locaux
utilisés (latin, cyrillique, japonais, chinois, etc.). Le pattern +([[:blank:]]) signifie les caractères
espace et tab répétés 1 fois ou plus (au moins 1 occurrence).
Explication sur l’expansion des paramètres : http://wiki.bash-hackers.org/syntax/pe
Explication sur les symboles utilisés dans le pattern : http://wiki.bash-hackers.org/syntax/pattern
3|Page
sed
cat db_nom.out | sed 's/^[ \t]*//'
Explication: substituer les caractères espace ou tab au début d’une ligne par le vide. Les caractères à
substituer sont entre crochets qui leur procurent un ou-logique. Le caractère * suivant les crochets
signifie la répétition d’un nombre quelconque de fois incluant 0 fois du caractère précédent. Le
caractère ^ signifie au début d’une ligne.
3. Éliminer les espaces ou tab à la fin de chacune des lignes
Note : Il n’y a pas de façon directe pour réaliser cette tâche. Voir question #2.
Non sed
Lire ligne par ligne et utiliser l’expansion des paramètres bash pour débarrasser les caractères
espace et tab au début d’une ligne. L’expansion des paramètres est expliquée bash
while read VAR; do echo "${VAR%%+([[:blank:]])}"; done < db_nom.out
Explication: cette solution est identique à celle utilisée dans la question #2. Seul le symbole ## a été
remplacé par %%. Cette expansion consiste à enlever le pattern de la variable parameter à partir de
la fin de son contenu. De plus, les symboles %% signifie trouver le pattern le plus long à enlever.
Pour mieux voir le résultat obtenu, le caractère espace a été remplacé par + et le caractère tab a été
remplacé par le caractère *.
4|Page
sed
cat db_nom.out | sed 's/[ \t]*$//'
La seule différence entre cette solution et celle de la question #2 est l’utilisation du symbole $ au
lieu de ^. Le symbole $ signifie à la fin d’une ligne.
4. Séparer chacun des champs par un seul séparateur (choisir le séparateur qui vous convient mais il
doit être un caractère visible)
Non sed
Note : combiner les solutions 2 et 3 avec tr ‘ \t’ ‘ :’ pour donner un beau résultat à la sortie
standard.
sed
cat db_nom.out | sed ‘s/^[ \t]*//;s/[ \t]*$//;s/[ \t]\+/:/g’
Explication: dans sed on peut donner plusieurs commandes séquentiellement. Il suffit de les séparer
par des points-virgules (;). La première commande et la deuxième commande sont les mêmes que
celles des questions #2 et #3. La 3e commande indique à sed de remplacer les caractères espace et
tab apparus 1 fois ou plus par le caractère deux-points (:). Le symbole \+ est utilisé pour indiquer
apparition d’au moins 1 fois du caractère précédent.
5|Page