Exercice Unix corrigé les Jokers et les expressions régulières

  1.  Vous avez chez vous des fichiers appelés essai1, essai2, essai3 et essai4. Comment les effacer en une seule ligne de commande ?

Il s’agit de donner le nom des fichiers en indiquant qu’ils commencent par essai et qu’ils finissent par un chiffre. Il y a en fait plusieurs façons de faire :

    • rm essai[1234] : les crochets signifient «l’un des caractères qui se trouvent entre crochets»;
    • rm essai[1-4] : c’est le même principe, sauf que l’on indique un intervalle au lieu d’écrire explicitement les chiffres;
    • rm essai? : le point d’interrogation désigne n’importe quel caractère unique, le point y compris, sauf si le nom du fichier commence par un point (ls ?pine dans $HOME ne vous donnera pas, par exemple, la liste des fichiers de configuration de Pine : .pinerc, etc).

Ici, on trouvera tous les fichiers commençant par essai, suivi d’un unique caractère qui peut ne pas être un chiffre.

    • rm essai* : c’est la formulation la plus vague : effacer les fichiers dont le nom commence par essai suivi de quelque chose, c’est-à-dire d’un nombre indéfini de caractères, ou aucun.
  1. Dans mon répertoire d’accueil, j’ai un certain nombre de fichiers avec un suffixe .c. Je désire les regrouper dans un répertoire que j’appelerai C/. Quelles sont les commandes que je dois taper ?

On commande par créer un répertoire C avec mkdir, puis, avec mv, on déplace tous les fichiers ayant un suffixe . et dont le nom est fait d’une suite de caractères quelconques :

galion ~ $  ls
hello*    zoinx*
hello.c   zoinx.c
galion ~ $  mkdir C
galion ~ $  mv *.c C/
galion ~ $  ls
C/        hello*     zoinx*
galion ~ $  ls C/
hello.c   zoinx.c
  1. Vous désirez regrouper dans un répertoire Rangement les fichiers dont le nom contient un caractère minuscule suivi d’un caractère majuscule. Quelle(s) est/sont la/les commande(s) à donner ?

On commence par créer le répertoire Rangement avec mkdir. Pour désigner les noms des fichiers, il faut indiquer la notion de «minuscule». On pourrait écrire explicitement l’alphabet entre crochets, pour dire «l’un de ces caractères», puis faire de même avec les majuscules. Mais on gagne du temps en utilisant des intervalles ([a-z] et [A-Z]). Le reste du nom du fichier, avant et après la minuscule puis la majuscule, est indéfini. On écrit donc :

galion ~ $ mkdir Rangement
galion ~ $ mv *[a-z][A-Z]* Rangement/
  1. Même chose avec les fichiers dont le nom contient trois voyelles à la suite.

Le principe est le même, sauf que l’on indique explicitement les voyelles entre crochets :

galion ~ $ mkdir Rangement
galion ~ $ mv *[aeiou][aeiou][aeiou]* Rangement/
  1. En utilisant ls et grep, affichez la liste des fichiers dans /bin dont le nom correspond à un motif donné.

On peut procéder de deux façons : utiliser ls seul et des jokers, ou rediriger ls dans grep et utiliser les expressions régulières de grep.

Attention

Dans la suite du corrigé, on suppose que l’on se trouve déjà dans /bin/.

On met des apostrophes autour des expressions de grep pour les protéger contre le shell. Enfin, on ne détaille pas les expressions régulières; à noter ces points importants à propos de grep :

    • Le chapeau (^) en début d’expression désigne le début de la ligne;
    • Le dollar en fin d’expression désigne la fin de la ligne;
    • Le point désigne n’importe quel caractère;
    • L’étoile signifie «zéro ou plus de fois le caractère qui précède»; c’est un multiplicateur;
    • Comme avec les jokers du shell, [^m] veut dire «sauf le caractère m».

On constate que grep est plus complexe mais bien plus puissant que les jokers du shell.

Avec ls seul

Avec ls et grep

Commence par «a» et dont la deuxième lettre est «s» ou «t»

ls a[st]*

ls | grep '^a[st].*'

Contient «un» et se termine par «t»

ls *un*t

ls | grep '.*un.*t$'

Contient «gre» ou «st»

ls *(gre|st)*

ls | grep '\(gre\|st\)'

Contient exactement deux lettres «m»

ls | grep '[^m]*m[^m]*m[^m]*'

Contient au moins deux lettres «m»

ls | grep '.*m.*m.*'

Contient au moins quatre caractères et aucun chiffre

ls | grep '^[^0-9]\{4,\}$'

Est constitué de deux lettres exactement

ls ??

ls | grep '^..$'

Commence et finit par un chiffre

ls [0-9]*[0-9]

ls | grep '^[0-9].*[0-9]$'

  1. Comment éliminer les lignes vides dans un fichier ? Comment éliminer les lignes ne contenant que des blancs ? Comment éliminer toutes les lignes blanches ?

Une ligne vide est différente d’une ligne ne contenant que des blancs, c’est-à-dire des espaces ou des tabulations, même si pour un oeil humain cela revient au même. La commande de recherche sera différente selon le cas :

    • Lignes vides : c’est «rien entre le début et la fin de la ligne»; on écrit donc :
grep '^$' fichier
    • Lignes ne contenant que des blancs : on utilise une classe de caractère préexistante : [:space:]. On écrit donc :
grep '^[[:space:]]$' fichier

Pour éliminer toutes les lignes blanches pour un oeil humain, on combine les deux expressions et on utilise l’option -v qui inverse le sens de la recherche. On n’a plus qu’à rediriger la sortie dans un fichier. On écrit donc :

grep -v  '\(^[[:space:]]$\|^$\)' fichier1 > fichier2

en remplaçant éventuellement le motif par '^$' ou ^[[:space:]]$' selon que l’on veut ôter les lignes vides ou les lignes contenant des blancs.

Télécharger aussi :

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *