Outils pour utilisateurs

Outils du site


td_-_expressions_regulieres

Ceci est une ancienne révision du document !


Expressions régulières

Le but de TD est de faire l'apprentissage de la manipulation des expressions régulières. Cet apprentissage s'illustrera au travers de deux outils sed et grep.

Rappels sur les expressions régulières

Début de ligne                           : ^
Fin de ligne                             : $
N'importe quel caractère                 : .
Zéro ou une occurrence                   : ?
Zéro ou plusieurs occurrences            : *
Une ou plusieurs occurrences             : +
Exactement 'n' occurrences               : {n}
Au moins 'n' occurrences                 : {n,}
Entre n et m occurrences                 : {m,n}
'a' ou 'b' ou 'c'                        : a|b|c
Ensemble de caractères {a, b, c}         : [abc]
Ensemble de caractères {a, ..., z }      : [a-z]
Caractère n'appartenant pas à l'ensemble : [^...]
Regroupement et capture de caractères.   : (...)
Références à des regroupements.          : \1, \2, ...

Rappel sur SED

Il s'agit d'un éditeur ne travaillant pas en mode interactif. Les fichiers édités ne sont pas modifiés : leur contenu est simplement utilisé pour construire un flux sur la sortie standard. A ce titre sed est un filtre pour le bash.

sed [-n] [-e command_sed] [-f file_com] [ref ...]

… a pour effet de copier le (ou les fichiers) sources ref sur la sortie standard après application aux lignes complètes du fichier (c'est-à-dire contenant un caractère de fin de ligne) de toutes les commandes contenues dans le fichier file_com et les différentes commandes introduites en paramètres par un argument -e (-e est l'option par défaut). Par défaut, le fichier traité est l'entrée standard.

Forme générale des commandes

[adresse1 [,adresse2]] fonction [argument ...]

Une adresse est :

  • soit un nombre décimal qui représente le numéro de ligne (quand il y a plusieurs fichiers, l'éditeur considère qu'il y en a qu'un formé de la concaténation des différents fichiers);
  • soit le caractère $ interprété comme l'adresse de la dernière ligne ;
  • une expression régulière entre exprimée entre deux /.

Intervalle concerné : adresse1, adresse2 (par défaut, tout le fichier sera traité). On peut imbriquer les commandes afin de les appliquer à une même adresse, on utilise alors \{ et \} aprés adresse.

Le fonctionnement

sed maintient un tampon de travail où chaque ligne est successivement chargée et toutes les commandes qui la concernent (adresse1, adresse2) lui sont appliquées, après quoi la ligne est écrite sur la sortie standard (sauf si -n a été donné au chargement, auquel cas seules les commandes explicites d'impression provoqueront une impression). Quand toutes les instructions ont été appliquées, la ligne courante est affichée et la ligne suivante est placée dans le tampon de travail.

Les fonctions

nb adr commande actions
[0] # texte commentaire jusque la fin de ligne
[1] a\ texte concaténation du texte avant de lire la ligne suivante
[2] c\ texte suppression de l'espace de travail correspondant à l'intervalle et écriture du texte sur la sortie.
[2] d suppression de l'espace de travail. Exemple : sed /toto/d file supprime les lignes contenant toto dans file
[2] D suppression de l'espace de travail jusqu'au premier caractère de fin de ligne (précédé du caractère \ qu'il contient)
$[1]$ \verbi\ {\em texte}
$[2]$ \verbp \'ecrit l'espace de travail sur la sortie standard. Exemple : {\tt sed} -n ``/toto/p {\em file} n'\'ecrit que les lignes de {\em file} contenant toto
\ & q & terminaison
^ $[2]$ | \verb|r| {\em file} | \'ecrit le contenu de {\em file} avant de continuer
^ $[2]$ | \verb|s/regexpr/| \verb|chaine/ind| | substitution d'un motif \`a un autre d\'efini au moyen d'expressions r\'eguli\`eres. Les indicateurs sont g : toutes les occurrences, p : \'ecrit si une substitution a \'et\'e effectu\'ee, w {\em file} : \'ecriture dans {\em file}. Le contenu est concat\'en\'e si une substitution a \'et\'e effectu\'ee.
^ $[2]$ | \verb|w| {\em file} | \'ecrit l'espace de travail dans {\em file}.
^ $[2]$ | \verb|y/chaine_1/| \verb|chaine_2| & toutes les occurrences des caract\`eres figurant dans cha\^ine\_1 sont remplac\'es par le caract\`ere correspondant (c'est-\`a-dire en m\^eme position) de cha\^ine\_2.
^ $[2]$ | \verb|!| {\em commande} | ex\'ecution de la commande sur les lignes dont l'adresse n'est pas dans l'intervalle.
^ $[2]$ | \verb|=| | Donne le num\'ero de la ligne s\'electionn\'ee sur la sortie standard.
\section{Un peu d'entra\^inement} Que fait la commande suivante ? \begin{verbatim} sed -n '/^[0-9]\+$/p' fich.txt \end{verbatim} \noindent Donner le r\'esultat de la commande suivante : \begin{verbatim}echo ``aabbabbaab

pour : \begin{verbatim}motif='s/[ab]*/x/'\end{verbatim} \begin{verbatim}motif='s/a.*b/y/'\end{verbatim} \begin{verbatim}motif='s/a.*bb/z/'\end{verbatim} \begin{verbatim}motif='s/a\?b/z/g'\end{verbatim} \begin{verbatim}motif='s/aab\|ba\|bba/ab/g'\end{verbatim}

\noindent donner le r\'esultat des commandes suivantes : \begin{verbatim}echo ``ejkf fed 158e fd | sed 's/[^0-9]*\([0-9]\+\)[^0-9]*/\1/' \end{verbatim} \begin{verbatim}echo ``ejkf fed 158e fd | sed 's/.*\([0-9]\+\).*/\1/' \end{verbatim}

\section{Head}

R\'e\'ecrire la commande head en utilisant sed.

\section{Html}

\'Ecrire un script qui extrait le titre de toutes les pages html.

%\section{To Upper} %\noindent Ecrire une commande qui transforme les caract\`eres du fichier fich.txt en majuscule.

\section{Cut}

\'Ecrire une commande qui extrait la premi\`ere colonne du fichier fich.txt. Le caract\`ere de s\'eparation \'etant ':'.

D\'eplacer la 1$^{ere}$ colonne en derni\`ere position.

\section{Date}

La fonction date renvoie un r\'esultat de la forme suivante :

\begin{verbatim} jeu jan 26 17:26:47 CET 2019 \end{verbatim}

\'Ecrivez une commande, en utilisant date et sed, permettant d'obtenir le r\'esultat suivant :

\begin{verbatim} Nous sommes le jeu 26 jan 2019 et il est 17:26:47. \end{verbatim}

\'Ecrire la commande grep permettant de r\'ecup\'erer dans le fichier fich.txt les lignes contenant des heures valides (format hh:mm:ss).

\section{Un peu de grep}

Que font les commandes suivantes ([ ] contient un espace et une tabulation) : \begin{verbatim} grep -c '^[ ]*$' fich.txt grep -c '^[^ ]\+$' fich.txt grep -c '[^ ]' fich.txt grep -n -v '[^ ]\+$' fich.txt \end{verbatim}

\section{Update}

\'Ecrivez une commande qui liste les noms de r\'epertoires commen{\c c}ant par la lettre a.

\bigskip

\'Ecrivez la commande permettant d'obtenir l'affichage suivant :

\begin{verbatim} fichier poly-se.aux modifie ce jour a 17:00 fichier poly-se.dvi modifie ce jour a 17:24 fichier poly-se.log modifie ce jour a 17:56 fichier poly-se.ps modifie ce jour a 17:01 fichier poly-se.toc modifie ce jour a 17:56 fichier td_sed.tex modifie ce jour a 17:56 \end{verbatim}

\section{Liste des extensions}

\begin{verbatim} $ls abc ab.o ab.tar.gz a.c a.o bcabdc.c ccabdc.zip \end{verbatim}

Ecrivez la commande permettant d'obtenir l'affichage suivant : \begin{verbatim} .c .gz .o .zip \end{verbatim}

td_-_expressions_regulieres.1548172574.txt.gz · Dernière modification : 2019/01/22 15:56 de gilles