Le rapport que vous enverrez par TPLab consistera en un unique fichier texte (extension ".txt
").
Toutes les réponses contenant une ligne de commande devront être sur une seule ligne précédée d'un caractère "$
". (Pour que je puisse les extraire avec ... grep
!)
Par exemple :
Pierre Hyvernat TP1 info633 Question 0 ========== Pour obtenir la liste des fichier ".c" dans le répertoire courant, on peut utiliser $ ls *.c Question 1 ========== ... ...
Les motifs du shell contiennent :
signification | bash |
joker (1 caractère) | ? |
joker (plusieurs caractères, éventuellement zéro) | * |
caractère parmi ... |
[...] |
caractère sauf ... |
[!...] ou [^...] |
caractères ? * |
\? \* |
Si votre shell par défaut est différent de bash, il peut y avoir quelques différences. Pour changer le shell courant, vous pouvez utiliser la commande
$ exec bash
dans votre terminal.
La commande
$ ls *.c
permet de lister tous les fichiers dont l'extension est ".c
".
.c
ou .h
,
.
".
Pour tester, vous pouvez créer des fichiers vides (dans un répertoire temporaire) avec la commande touch
:
$ touch fichier1.c Fichier2.h FICHIER3.jpg
Créez les fichiers suivants dans un répertoire temporaire :
$ touch test.jpg test.jpeg test-1.gif test-1.1.gif test-1.2.gif
Certain shells, comme bash, ont des motifs plus perfectionnés. Utilisez la commande suivante pour activer les motifs étendus de bash :
$ shopt -s extglob
Vous pouvez maintenant utiliser un nouveau type de motif : (reportez vous à la section pertinente du manuel de bash pour plus de détails)
signification | bash |
chaine ne correspondant à aucun motif ... |
!(...|...|...|...) |
$ ls *!(.jpeg|.jpg) ??? $ ls *.!(gif) ???
.jpg
et .jpeg
?
grep
est une commande POSIX qui permet
d'afficher les lignes d'un fichier contenant un motif donné par une expression
régulière (regex).
L'utilisation courante est
$ grep 'regex' fichier1 fichier2 ...
Les guillemets autour de l'expression régulière ne sont pas toujours obligatoires. Ils évitent au shell de considérer l'expression régulière comme un motif du shell... D'autre part, si aucun fichier n'est donné, grep
utilisera l'entrée standard à la place.
Les arguments (optionnels) importants, à mettre avant la regex, sont :
-i
" pour préciser de ne pas faire la différence entre minuscules et majuscules,
-v
" pour n'afficher que les lignes qui ne contiennent pas le motif,
-l
" pour seulement afficher le nom des fichiers qui contiennent le motif,
-c
" pour seulement afficher le nombre de lignes contenant le motif,
-E
" pour préciser que le motif est une expression régulière POSIX étendue.
D'autres arguments optionnels standard (mais non POSIX) bien pratique sont :
-C
" suivi d'un nombre, qui permet d'afficher les quelques lignes avant et après les ligne contenant le motif,
-r
" pour préciser qu'on veut chercher dans les répertoires récursivement.
L'expression régulière peut être donnée soit par :
-E
" : Extended Regular Expression (ERE).
Les différences entre les deux sont résumées dans le tableau suivant. Les 6 premières lignes contiennent les notions les plus importantes et sont les même dans les BRE et les ERE. Les différences sont qu'en syntaxe BRE, les autres caractères spéciaux sont précédés d'un antislash.
signification | BRE | ERE |
joker (sauf retour chariot) | . |
. |
répétition | * |
* |
un caractère parmi ... |
[...] |
[...] |
un caractère sauf ... |
[^...] |
[^...] |
début de ligne | ^ |
^ |
fin de ligne | $ |
$ |
groupement | \( \) |
( ) |
répétition entre m et n fois | \{ m, n\} |
{ m, n} |
alternative | \| (non POSIX) |
| |
répétition, au moins une fois | \+ |
+ |
zéro ou une occurence d'un motif | \? (non POSIX) |
? |
référence au n-ème groupe | \1 \2 ... |
\1 \2 ... (non POSIX) |
caractères normaux ( ) [ ] { } | + ? |
( ) [ ] { } | + ? |
\( \) \[ \] \{ \} \| \+ \? |
\$
" signifie "le caractère dollar".
^
" (en premier caractère), le "]
" (ailleurs qu'en premier caractère).
[abcf-xz]
" donnera la même chose que "[abcfghijklmnopqrstuvwxz]
".
grep
seulement.
Pour tester interactivement vos expressions régulières, vous pouvez utiliser la commande suivante :
$ grep -H --label="OK" 'regex'
Vous pouvez ensuite écrire des lignes : chaque ligne correspondant à la regex sera réaffichée. (Si la ligne ne correspondait pas, rien n'est affiché...) Pour quitter, il suffit d'appuyer sur la touche "Control" et "c" (en même temps), ou sur la touche "Control" et "d" (en même temps).
Par exemple :
$ grep -H --label="OK" 'ab*c' abc OK:abc <---- abc contient le motif, la ligne est affichée cba <---- aucun résultat cbba <---- aucun résultat abbc OK:abbc <---- abbc contient le motif, la ligne est affichée
La regex "\(aa\)*
" (ou "(aa)*
" en syntaxe ERE) devrait correspondre à l'ensemble des suites de "a
" dont la taille est paire.
Testez cette regex comme décrit ci dessus (en mode BRE et en mode ERE, càd en ajoutant l'option "-E
" sur la ligne de commandes) sur les chaines :
aaa
",
bb
",
aabbaa
".
Expliquez les résultats et corrigez la regex en utilisant "^
" et "$"
. N'oubliez pas de la tester !
Donnez les deux lignes de commande correspondantes (mode BRE et mode ERE).
Pour mieux visualiser le résultat, il est pratique d'ajouter l'argument --color
.
La partie de la ligne qui correspond à la regex sera affiché en couleurs:
$ grep -H --label="OK" --color 'ab*c' abc OK:abc cba <---- aucun résultat cbba <---- aucun résultat abbcdef OK:abbcdef
Si vous utilisez grep
fréquemment, vous pouvez définir la variable d'environnement "GREP_OPTIONS" dans votre fichier ".bashrc
" (si vous utilisez bash
) avec
export GREP_OPTIONS=--color=auto
Donnez une regex pour reconnaitre les chaines du langage C : elles commencent et terminent par des guillemets "
et chaque guillemet "
interne doit être précédé d'un antislash.
"toto" "C:\\<chemin>\"..." "a\"b'c\'d\\e\\"" "" "\"\"\"\""
"test1 test2" "oups"..." " "abc\"def"\ghi" " " "
L'antislash "\
" est représenté par "\\
" dans les regex !
Donnez (et testez) une regex en syntaxe étendue pour reconnaitre toutes les chaines qui ne contiennent ni 2 "a
" ni 2 "b
" consécutifs.
Le fichier american-english contient les mots courants de la langue anglaise (avec accords et conjugaisons), à raison de un mot par ligne.
Le mot h
a
m
b
urger
contient les lettres a
et b
dans l'ordre.
Y'a t'il des mots anglais qui contiennent les lettres a
, b
, c
, d
et e
dans l'ordre ? Donnez l'expression régulière que vous utilisez.
Donner une expression régulière qui liste tout les mots contenant une lettre doublée, comme "blo
ss
om
" ou "z
oo
m
".
Indice : il faudra utiliser un groupe et une référence...
Plus difficile, donnez une expression régulière qui donne les mots avec lettre doublée qui ne sont pas des noms propres. (C'est à dire qui ne commencent pas par une lettre majuscule...)
Y'a t'il des mots anglais contenant une même lettre 6 fois ?
Donnez la ligne de commande que vous utilisez...
Bonus
Testez l'expression régulière (BRE, conforme POSIX) ^\(aaa*\)\1\1*$
sur des chaines de a
. Essayer de décrire en français le langage correspondant.
Il est parfois plus pratique d'utiliser plusieurs appels à la commande grep
plutôt que de trouver une unique expression régulière. On peut utiliser pour ceci une redirection afin de chercher (avec grep
) dans le résultat d'un appel précédent à grep
.
Par exemple, on peut obtenir la liste des mots qui contiennent à la fois 2 n
et p
, dans n'importe quel ordre :
$ grep 'nn' american-english | grep 'pp'
Cherchez la liste des mots anglais qui :
On peut également utiliser grep
sur le résultat d'une autre commande arbitraire.
La commande
$ ps aux
affiche la liste de tous les processus existant, avec une multitude d'informations.
Donnez une commande pour afficher la liste des processus des navigateurs internet, c'est à dire dont le nom contient firefox
, chromium
ou iceweasel
.
Améliorez votre ligne de commande pour ne pas afficher les lignes qui ne servent à rien.
La plupart des éditeurs de texte utilisent une bibliothèque d'expressions régulières qui étend les expressions régulières étendues POSIX. C'est notamment le cas de geany et Sublime Text (ainsi que Notepad++) (L'éditeur gedit n'utilise pas de regex sans plugin.)
U
tiliser des expressions régulières
" dans la fenêtre de recherche,
.*
" ("Regular Expressions (Alt-R)
" tout à gauche dans la barre de recherche.
Faites une recherche pour visualiser toutes les lignes contenant des caractères blancs (espaces et tabulation) juste avant le retour chariot. Sur le fichier MobyDick.txt, vous devriez obtenir quelque chose comme
Sublime Text | geany |
Recherchez de la même manière les lignes qui commencent par une tabulation...
À l'aide d'un "chercher / remplacer" et d'une expression régulière, supprimez tous les espaces en début de ligne dans le fichier MobyDick.txt.
Vous disposez du fichier csv
suivant
NOM, PRÉNOM Allocca, Keith Bengochia, Essie Brooking, Elana Bukowiecki, Lanny Cailler, Santana Cardillo, Shizuko Coello, Miss Dambrosio, Roni Ebadi, Sallie Fernando, Pearl Flaminio, Mayra Flieller, Bibi Gibb, Cesar Hawker, Dusty Isles, Karry Kibler, Francisco Kingcade, Les Korbin, Darby Korner, Humberto Lindelof, Kimberly Madaffari, Illa Mikota, Marvella Pangle, Travis Quijas, Dann Reighard, Valentina Ruman, Dorine Scheide, Dorthea Stetke, Hector Tillery, Lorriane Wolfinbarger, Josue
À l'aide d'une expression régulière et d'un "chercher / remplacer", inversez l'ordre des champs "NOM
" et "PRÉNOM
" dans tout le fichier.
Si vous avez besoin de faire des changements simples (comme les chercher / remplacer des questions précédentes) sur de nombreux fichiers, il peut-être pratique d'écrire un script pour automatiser la tache.
Renseignez-vous sur la commande sed
(par exemple, en regardant
la page de manuel "man sed
",
la page wikipedia,
le manuel officiel GNU "info sed
",
un exemple de tutoriel très complet,
...) et proposez des commandes pour répondre aux questions précédentes sans éditeur de texte interactif.