Ceci est une ancienne révision du document !
Table des matières
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]$ | \verb | i\ | {\em texte} | |
$[2]$ | \verb | p | \'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 |
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}