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