Prochaine révision | Révision précédente |
td_-_expressions_regulieres [2019/01/22 15:37] – created gilles | td_-_expressions_regulieres [2022/03/15 15:05] (Version actuelle) – [Lister des fichiers] gilles |
---|
</code> | </code> |
| |
\begin{tabular}{rl} | ==== Rappel sur SED ==== |
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 é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''. |
| |
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. | <code bash> |
| sed [-n] [-e command_sed] [-f file_com] [ref ...] |
| </code> |
| |
\centerline{{\tt sed} [-n] [-e {\em command\_sed}] [-f {\em file\_com}] [{\em ref} ...]} a pour effet de copier le (ou les fichiers) sources {\em ref} sur la sortie standard apr\`es application aux lignes compl\`etes du fichier (c'est-\`a-dire contenant un caract\`ere fin de ligne) de toutes les commandes contenues dans le fichier {\em file\_com} et les diff\'erentes commandes introduites en param\`etres par un argument -e (-e est l'option par d\'efaut). Par d\'efaut, le fichier trait\'e est l'entr\'ee standard. | ... 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. |
| |
\subsubsection{Forme g\'en\'erale des commandes} | === Forme générale des commandes === |
| |
\centerline{[adresse1 [,adresse2]] fonction [argument ...]} | <code bash> |
| [adresse1 [,adresse2]] fonction [argument ...] |
| </code> |
| |
Une adresse est : | Une adresse est : |
\begin{itemize} | * 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); |
\item soit un nombre d\'ecimal qui repr\'esente le num\'ero de ligne (quand il y a plusieurs fichiers, l'\'editeur consid\`ere qu'il y en a qu'un form\'e de la concat\'enation des diff\'erents fichiers); | * soit le caractère ''$'' interprété comme l'adresse de la dernière ligne ; |
\item soit le caract\`ere \$ interpr\'et\'e comme l'adresse de la derni\`ere ligne ; | * une expression régulière entre exprimée entre deux ''/''. |
\item une expression r\'eguli\`ere entre \verb|/|. | |
\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} | 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''. |
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} | === Le fonctionnement === |
| |
\begin{tabular}{cp{4cm}p{7cm}} | ''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. |
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} \\ | |
$[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'' {\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.\\ | |
\end{tabular} | |
| |
\section{Un peu d'entra\^inement} | === Les fonctions === |
| |
Que fait la commande suivante ? | ^ 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] | ''i\ texte'' | insertion du ''texte'' sur la sortie standard | |
| ^ [2] | ''p'' | écrit l'espace de travail sur la sortie standard. Exemple : ''sed} -n /toto/p file'' n'écrit que les lignes de ''file'' contenant ''toto'' | |
| ^ | q | terminaison | |
| ^ [2] | ''r file'' | écrit le contenu de ''file'' avant de continuer | |
| ^ [2] | ''s/regexpr/ chaine/ind'' | substitution d'un motif à un autre défini au moyen d'expressions régulières. Les indicateurs sont ''g'' : toutes les occurrences, ''p'' : écrit si une substitution a été effectuée, ''w file'' : écriture dans ''file''. Le contenu est concaténé si une substitution a été effectué. | |
| ^ [2] | ''w file'' | écrit l'espace de travail dans ''file''. | |
| ^ [2] | ''y/chaine1/chaine2'' | toutes les occurrences des caractères figurant dans ''chaine1'' sont remplacées par le caractère correspondant (c'est-à-dire en même position) de ''chaine2''. | |
| ^ [2] | ''! commande'' | exécution de la ''commande'' sur les lignes dont l'adresse n'est pas dans l'intervalle. | |
| ^ [2] | ''='' | Donne le numéro de la ligne sélectionnée sur la sortie standard. | |
| |
\begin{verbatim} | |
sed -n '/^[0-9]\+$/p' fich.txt | |
\end{verbatim} | |
| |
\noindent Donner le r\'esultat de la commande suivante : | ==== Un peu d'entraînement ==== |
\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 : | * Que fait la commande suivante ? |
\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} | <code bash> |
| sed -n '/^[0-9]\+$/p' fich.txt |
| </code> |
| |
\section{Head} | * Donner le résultat de la commande suivante pour différentes valeurs de ''motif'' : |
| |
R\'e\'ecrire la commande head en utilisant sed. | <code bash> |
| echo aabbabbaab | sed $motif |
| </code> |
| |
\section{Html} | <code bash> |
| motif='s/[ab]*/x/' |
| motif='s/a.*b/y/' |
| motif='s/a.*bb/z/' |
| motif='s/a\?b/z/g' |
| motif='s/aab\|ba\|bba/ab/g' |
| </code> |
| |
\'Ecrire un script qui extrait le titre de toutes les pages html. | * Donner le résultat des commandes suivantes : |
| |
%\section{To Upper} | <code> |
%\noindent Ecrire une commande qui transforme les caract\`eres du fichier fich.txt en majuscule. | echo "ejkf fed 158e fd" | sed 's/[^0-9]*\([0-9]\+\)[^0-9]*/\1/ |
| echo "ejkf fed 158e fd" | sed 's/.*\([0-9]\+\).*/\1/' |
| </code> |
| |
\section{Cut} | |
| |
\'Ecrire une commande qui extrait la premi\`ere colonne du fichier fich.txt. Le caract\`ere de s\'eparation \'etant ':'. | ==== HEAD ==== |
| |
D\'eplacer la 1$^{ere}$ colonne en derni\`ere position. | Réécrire la commande ''head'' en utilisant ''sed''. |
| |
\section{Date} | ==== HTML ==== |
| |
La fonction date renvoie un r\'esultat de la forme suivante : | Ecrire un script qui extrait le titre de toutes les pages ''html''. |
| |
\begin{verbatim} | ==== A partir d'un fichier ... ==== |
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 : | On suppose le fichier suivant ''fich.txt'' qui contient : |
| |
\begin{verbatim} | <code> |
Nous sommes le jeu 26 jan 2019 et il est 17:26:47. | Marcel:Michu:16:55:09 |
\end{verbatim} | Ghislaine:Verboten:56:13:29 |
| Raymond:Calbuth:25:67:09 |
| </code> |
| |
\'Ecrire la commande grep permettant de r\'ecup\'erer dans le fichier fich.txt les lignes contenant des heures valides (format hh:mm:ss). | * Ecrire une commande qui transforme les caractéres du fichier ''fich.txt'' en majuscule |
| * Ecrire une commande qui extrait la première colonne du fichier ''fich.txt''. Le caractère de séparation est '':''. |
| * Déplacer la colonne de gauche en dernière position. |
| |
\section{Un peu de grep} | ==== DATE ==== |
| |
Que font les commandes suivantes ([ ] contient un espace et une tabulation) : | La fonction date renvoie un résultat de la forme suivante : |
\begin{verbatim} | |
grep -c '^[ ]*$' fich.txt | |
grep -c '^[^ ]\+$' fich.txt | |
grep -c '[^ ]' fich.txt | |
grep -n -v '[^ ]\+$' fich.txt | |
\end{verbatim} | |
| |
\section{Update} | <code> |
| jeu jan 26 17:26:47 CET 2019 |
| </code> |
| |
\'Ecrivez une commande qui liste les noms de r\'epertoires commen{\c c}ant par la lettre a. | Ecrivez une commande, en utilisant ''date'' et ''sed'', permettant d'obtenir le résultat suivant : |
| |
\bigskip | <code> |
| Nous sommes le jeu 26 jan 2019 et il est 17:26:47. |
| </code> |
| |
\'Ecrivez la commande permettant d'obtenir l'affichage suivant : | Ecrire la commande ''grep'' permettant de récupérer dans le fichier ''fich.txt'' les lignes contenant des heures valides (format ''hh:mm:ss''). |
| |
\begin{verbatim} | ==== Un peu de GREP ==== |
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} | Que font les commandes suivantes ? (''[ ]'' contient un espace et une tabulation) : |
| |
\begin{verbatim} | <code bash> |
$ls | grep -E -c '^[ ]*$' fich.txt |
abc ab.o ab.tar.gz a.c a.o bcabdc.c ccabdc.zip | grep -E -c '^[^ ]+$' fich.txt |
\end{verbatim} | grep -E -c '[^ ]' fich.txt |
| grep -E -n -v '[^ ]+$' fich.txt |
| </code> |
| |
Ecrivez la commande permettant d'obtenir l'affichage suivant : | ==== Lister des fichiers ==== |
\begin{verbatim} | |
.c | |
.gz | |
.o | |
.zip | |
\end{verbatim} | |
| |
| La commande ''ls -l'' produit la sortie suivante |
| |
| <code> |
| drwxr-xr-x 4 gilles staff 128 22 jan 11:41 dir-1 |
| drwxr-xr-x 2 gilles staff 64 22 jan 14:41 dir-2 |
| -rw-r--r-- 1 gilles staff 0 22 jan 22:39 file-1 |
| -rw-r--r-- 1 gilles staff 0 22 jan 08:18 file-2 |
| -rw-r--r-- 1 gilles staff 0 22 jan 07:03 mon-script-exemple.sh |
| </code> |
| |
| * Modifiez cette commande afin d'obtenir : |
| |
| <code> |
| dir-1 modifie a 11:41 |
| dir-2 modifie a 14:41 |
| file-1 modifie a 22:39 |
| file-2 modifie a 08:18 |
| mon-script-exemple.sh modifie a 07:03 |
| </code> |
| |
| ==== Liste des extensions ==== |
| |
| <code bash> |
| $> ls |
| abc ab.o ab.tar.gz a.c a.o bcabdc.c ccabdc.zip |
| </code> |
| |
| Ecrivez la commande permettant d'obtenir l'affichage suivant : |
| <code bash> |
| .c |
| .gz |
| .o |
| .zip |
| </code> |