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, ...
\begin{tabular}{rl}
D\'ebut de ligne & \verb|^|
Fin de ligne & \verb|$|
N'importe quel caract\`ere & \verb|.|
Z\'ero ou une occurrence & \verb|\?|
Z\'ero ou plusieurs & \verb|*|
Une ou plusieurs & \verb|\+|
Exactement n occurrences & \verb|\{n\}|
Au moins n occurrences & \verb|\{n,\}|
Entre n et m occurrences & \verb|\{m,n\}|
a ou b ou c & \verb+a\|b\|c+
'(' & \verb|(|
')' & \verb|)|
'[' & \verb|\[|
']' & \verb|\]|
Ensemble de caract\`eres & \verb|[…]|
Caract\`ere n'appartenant pas \`a l'ensemble & \verb|[^…]|
Regroupement et capture de caract\`eres & \verb|\(…\)|
R\'ef\'erence & \verb|\1|
\end{tabular}
\subsection{Rappel sur Sed}
Il s'agit d'un \'editeur ne travaillant pas en mode interactif. Les fichiers \'edit\'es ne sont pas modifi\'es : leur contenu est simplement utilis\'e pour construire un flux sur la sortie standard.
\centerline/|.
\end{itemize}
Intervalle concern\'e : adresse1, adresse2 (par d\'efaut, tout le fichier sera trait\'e). On peut imbriquer les commandes afin de les appliquer \`a une m\^eme adresse, on utilise alors \{ et \} apr\`es adresse.
\subsubsection{Le fonctionnement}
Sed maintient un tampon de travail o\`u chaque ligne est successivement charg\'ee et toutes les commandes qui la concernent (adresse\_1 adresse\_2) lui sont appliqu\'ees, apr\`es quoi la ligne est \'ecrite sur la sortie standard (sauf si -n a \'et\'e donn\'e au chargement, auquel cas seules les commandes explicites d'impression provoqueront une impression). Quand toutes les instructions ont \'et\'e appliqu\'ees, la ligne courante est affich\'ee et la ligne suivante est plac\'ee dans le tampon de travail.
\subsubsection{Les fonctions}
\begin{tabular}{cp{4cm}p{7cm
nb adr & commande & actions
\hline
$[0]$ & \verb|#| texte & commentaire jusque la fin de ligne
$[1]$ & \verb|a\| texte & concat\'enation du texte avant de lire la ligne suivante
$[2]$ & \verb|c\| {\em texte} & suppression de l'espace de travail correspondant \`a l'intervalle et \'ecriture du {\em texte} sur la sortie.
$[2]$ & \verb|d| & suppression de l'espace de travail. Exemple : {\tt sed} ``/toto/d {\em file} supprime les lignes contenant toto dans {\em file}
{\em file} n'\'ecrit que les lignes de {\em file} contenant toto
$[2]$ & \verb|D| & suppression de l'espace de travail jusqu'au premier caract\`ere de fin de ligne (pr\'ec\'ed\'e du caract\`ere \verb|\| qu'il contient)
$[1]$ & \verb|i\| {\em texte} & insertion du {\em texte} sur la sortie standard
$[2]$ & \verb|p| & \'ecrit l'espace de travail sur la sortie standard. Exemple : {\tt sed} -n ``/toto/p
\ & 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.
\end{tabular}
\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 | sed $motif\end{verbatim}
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}