| Les deux révisions précédentesRévision précédente | |
| projets:ecole:scripting:initiation_au_shell [Le 04/08/2023, 00:00] – correction formatage des chevrons double pour ne pas être interprété par dokuwiki Amiralgaby | projets:ecole:scripting:initiation_au_shell [Le 24/04/2026, 14:04] (Version actuelle) – <code> -> <code bash> pour + de lisibilité ! bcag2 |
|---|
| Prenons un exemple, on connaît la commande "ls" qui donne la liste des fichiers d'un répertoire et on veut enregistrer le résultat dans un fichier. Pour cela on va rediriger le résultat dela sortie standard dans le fichier test à l'aide de la commande suivante : | Prenons un exemple, on connaît la commande "ls" qui donne la liste des fichiers d'un répertoire et on veut enregistrer le résultat dans un fichier. Pour cela on va rediriger le résultat dela sortie standard dans le fichier test à l'aide de la commande suivante : |
| |
| <code>ls > test</code> | <code bash>ls > test</code> |
| |
| De même si on veut enregistrer stderr de la commande "lfdfdfj", on utilise : | De même si on veut enregistrer stderr de la commande "lfdfdfj", on utilise : |
| |
| <code>lfdfdfj 2> test</code> | <code bash>lfdfdfj 2> test</code> |
| |
| Dans le premier exemple, on peut constater que l'on ne précise pas le descripteur de fichier redirigé (1), en effet le descripteur de fichier redirigé par défaut est stdout. | Dans le premier exemple, on peut constater que l'on ne précise pas le descripteur de fichier redirigé (1), en effet le descripteur de fichier redirigé par défaut est stdout. |
| Pour conserver le fichier original, vous pouvez utiliser %%">>"%% qui n'écrasera pas le contenu du fichier s'il existe déjà. Par exemple : | Pour conserver le fichier original, vous pouvez utiliser %%">>"%% qui n'écrasera pas le contenu du fichier s'il existe déjà. Par exemple : |
| |
| <code>ls >> test</code> | <code bash>ls >> test</code> |
| |
| Si test n'existe pas il sera créé, si il existe le résultat sera ajouté à son contenu (à la fin du fichier). De la même manière, vous pouvez rediriger stderr : | Si test n'existe pas il sera créé, si il existe le résultat sera ajouté à son contenu (à la fin du fichier). De la même manière, vous pouvez rediriger stderr : |
| |
| <code>lfdfdfj 2>> test</code> | <code bash>lfdfdfj 2>> test</code> |
| |
| Mais il est également possible de rediriger une sortie vers une autre sortie, par exemple "2>&1" signifie "rediriger stderr vers ce que représente stdout". Ainsi | Mais il est également possible de rediriger une sortie vers une autre sortie, par exemple "2>&1" signifie "rediriger stderr vers ce que représente stdout". Ainsi |
| |
| <code>ls > test 2>&1</code> | <code bash>ls > test 2>&1</code> |
| |
| redirigera stdout et stderr dans le fichier test. Vous remarquerez que les redirections s'effectuent de droite à gauche : la sortie stderr 2 est tout d'abord redirigée vers la sortie stdout 1, puis la sortie standard de ls s'inscrit dans le fichier test. | redirigera stdout et stderr dans le fichier test. Vous remarquerez que les redirections s'effectuent de droite à gauche : la sortie stderr 2 est tout d'abord redirigée vers la sortie stdout 1, puis la sortie standard de ls s'inscrit dans le fichier test. |
| "wc" permet de compter le nombre de lignes (option -l) ou de mots (option -w), plus d'informations dans la page man de wc, en entrée. Pour compter le nombre de lignes d'un fichier on peut donc utiliser : | "wc" permet de compter le nombre de lignes (option -l) ou de mots (option -w), plus d'informations dans la page man de wc, en entrée. Pour compter le nombre de lignes d'un fichier on peut donc utiliser : |
| |
| <code>wc -l < fichier</code> | <code bash>wc -l < fichier</code> |
| |
| Cette commande donnera le même résultat car wc peut prendre un fichier comme paramètre : | Cette commande donnera le même résultat car wc peut prendre un fichier comme paramètre : |
| | |
| <code>wc -l fichier</code> | <code bash>wc -l fichier</code> |
| |
| %%"<<"%% permet lui aussi de rediriger stdin mais jusqu'à une chaîne de caractère que l'on précisera : littéralement on pourrait dire que %%<<%% transmet notre entrée standard (clavier) au programme à sa gauche, et cela jusqu'à ce qu'il rencontre une ligne EOF ((End of File : Fin de fichier)). | %%"<<"%% permet lui aussi de rediriger stdin mais jusqu'à une chaîne de caractère que l'on précisera : littéralement on pourrait dire que %%<<%% transmet notre entrée standard (clavier) au programme à sa gauche, et cela jusqu'à ce qu'il rencontre une ligne EOF ((End of File : Fin de fichier)). |
| Par exemple la commande suivante vous permettra de taper un texte, d'aller à la ligne autant de fois que vous voulez en appuyant sur Entrée, puis lorsque vous taperez EOF (pour End of File, fin du fichier) et entrée, elle comptera le nombre de lignes (celle de EOF non comprise) que vous avez entrées. | Par exemple la commande suivante vous permettra de taper un texte, d'aller à la ligne autant de fois que vous voulez en appuyant sur Entrée, puis lorsque vous taperez EOF (pour End of File, fin du fichier) et entrée, elle comptera le nombre de lignes (celle de EOF non comprise) que vous avez entrées. |
| |
| <code>wc -l << EOF</code> | <code bash>wc -l << EOF</code> |
| |
| Vous pouvez bien sur spécifier un chaîne différente de EOF comme FIN, END... | Vous pouvez bien sur spécifier un chaîne différente de EOF comme FIN, END... |
| En utilisant %%">>"%% et %%"<<"%% nous pouvons facilement ajouter du texte dans un fichier de notre choix de la même manière qu'un éditeur de texte : | En utilisant %%">>"%% et %%"<<"%% nous pouvons facilement ajouter du texte dans un fichier de notre choix de la même manière qu'un éditeur de texte : |
| |
| <code>cat >> fichier << EOF</code> | <code bash>cat >> fichier << EOF</code> |
| |
| Le texte tapé sera ajouté au fichier jusqu'à ce que vous vous écriviez EOF et validiez par entrée. | Le texte tapé sera ajouté au fichier jusqu'à ce que vous vous écriviez EOF et validiez par entrée. |
| |
| ==== >/dev/null 2>&1 ==== | ==== >/dev/null 2>&1 ==== |
| Expliquons cette syntaxe très souvent rencontrée et reprise sans explication : <code>commande >/dev/null 2>&1</code> | Expliquons cette syntaxe très souvent rencontrée et reprise sans explication : <code bash>commande >/dev/null 2>&1</code> |
| Dans l'ordre, est exécuté : | Dans l'ordre, est exécuté : |
| |
| |
| La commande exécutée ne renverra ni sa sortie, ni ses messages d'erreur. | La commande exécutée ne renverra ni sa sortie, ni ses messages d'erreur. |
| C'est équivalent à : <code>commande > /dev/null 2 > /dev/null</code> | C'est équivalent à : <code bash>commande > /dev/null 2 > /dev/null</code> |
| |
| {{icons:iconnote.png }} | {{icons:iconnote.png }} |
| Si vous avez besoin de plus d'informations sur une commande n'hésitez pas à consulter son manuel via la commande : | Si vous avez besoin de plus d'informations sur une commande n'hésitez pas à consulter son manuel via la commande : |
| |
| <code>man nom_du_programme</code> | <code bash>man nom_du_programme</code> |
| |
| Pour cette partie, consulter http://doc.ubuntu-fr.org/console/commandes_de_base pour les commandes fondadamentales : cp, mv, ls, cd, rm, chmod, chown et find. | Pour cette partie, consulter http://doc.ubuntu-fr.org/console/commandes_de_base pour les commandes fondadamentales : cp, mv, ls, cd, rm, chmod, chown et find. |
| Voyons tout de suite un exemple : | Voyons tout de suite un exemple : |
| |
| <code>cut -d: -f1 /etc/passwd</code> | <code bash>cut -d: -f1 /etc/passwd</code> |
| |
| L'option "-d:" indique que le **séparateur** sera ":", et "-f1" indique que l'on veut récupérer seulement la **première partie**. | L'option "-d:" indique que le **séparateur** sera ":", et "-f1" indique que l'on veut récupérer seulement la **première partie**. |
| On peut aussi récupérer plusieurs parties en une seule fois en les séparant par des virgules, ici les parties 1 et 5 : | On peut aussi récupérer plusieurs parties en une seule fois en les séparant par des virgules, ici les parties 1 et 5 : |
| |
| <code>cut -d" " -f1,5 un_fichier</code> | <code bash>cut -d" " -f1,5 un_fichier</code> |
| |
| Maintenant si l'on travaille en fonction de la position : | Maintenant si l'on travaille en fonction de la position : |
| |
| <code>cut -c 1-10 /etc/passwd</code> | <code bash>cut -c 1-10 /etc/passwd</code> |
| |
| Vous l'aurez compris cette commande récupère les caractères de 1 à 10 du fichier passwd. | Vous l'aurez compris cette commande récupère les caractères de 1 à 10 du fichier passwd. |
| Par exemple, on désire afficher les 5 premières lignes du fichier /var/log/Xorg.0.log : | Par exemple, on désire afficher les 5 premières lignes du fichier /var/log/Xorg.0.log : |
| |
| <code>head -n 5 /var/log/Xorg.0.log</code> | <code bash>head -n 5 /var/log/Xorg.0.log</code> |
| |
| Pour les 5 dernières : | Pour les 5 dernières : |
| |
| <code>tail -n 5 /var/log/Xorg.0.log</code> | <code bash>tail -n 5 /var/log/Xorg.0.log</code> |
| |
| Pour récupérer le résultat d'une commande, nous allons utiliser l'opérateur | appelé **pipe** (qui signifie tuyau...), son fonctionnement sera expliqué plus bas. Pour récupérer les 5 dernières du résultat dedmesg : | Pour récupérer le résultat d'une commande, nous allons utiliser l'opérateur | appelé **pipe** (qui signifie tuyau...), son fonctionnement sera expliqué plus bas. Pour récupérer les 5 dernières du résultat dedmesg : |
| |
| <code>dmesg | tail -n 5</code> | <code bash>dmesg | tail -n 5</code> |
| |
| L'option -f permet d'afficher, à chaque fois qu'ils ont lieu, les ajouts au fichier, par exemple : | L'option -f permet d'afficher, à chaque fois qu'ils ont lieu, les ajouts au fichier, par exemple : |
| |
| <code>tail -f /var/log/syslog</code> | <code bash>tail -f /var/log/syslog</code> |
| |
| ===== Les pipes ===== | ===== Les pipes ===== |
| Cet opérateur permet d'envoyer la **sortie standard** d'un programme **vers** **l'entrée standard** d'un second programme, cela permet ainsi l'enchaînement des commandes. Par exemple : | Cet opérateur permet d'envoyer la **sortie standard** d'un programme **vers** **l'entrée standard** d'un second programme, cela permet ainsi l'enchaînement des commandes. Par exemple : |
| |
| <code>ls | wc -l</code> | <code bash>ls | wc -l</code> |
| |
| La sortie standard de "ls" devient l'entrée standard de "wc -l". | La sortie standard de "ls" devient l'entrée standard de "wc -l". |
| Autres exemples : | Autres exemples : |
| |
| <code>cat fichier | wc -l</code> | <code bash>cat fichier | wc -l</code> |
| |
| <code>ls -l | sort</code> | <code bash>ls -l | sort</code> |
| |
| {{:icons:icontip.png }} | {{:icons:icontip.png }} |
| Vous pouvez bien sûr étendre cela à plus de deux programmes : | Vous pouvez bien sûr étendre cela à plus de deux programmes : |
| |
| <code>cat fichier | wc -l | wc -L</code> | <code bash>cat fichier | wc -l | wc -L</code> |
| |
| Vous pouvez aussi utiliser les redirections vues précédemment : | Vous pouvez aussi utiliser les redirections vues précédemment : |
| |
| <code>ls -la > fichier | wc -l</code> | <code bash>ls -la > fichier | wc -l</code> |
| |
| Dans le cas de "ls -la > fichier" nous pouvons remarquer qu'il n'y a rien sur stdout ou stderr. Pour pallier à cela le programme tee permet de copier l'entrée standard sur la sortie standard et dans un fichier : "ls -la | tee fichier". | Dans le cas de "ls -la > fichier" nous pouvons remarquer qu'il n'y a rien sur stdout ou stderr. Pour pallier à cela le programme tee permet de copier l'entrée standard sur la sortie standard et dans un fichier : "ls -la | tee fichier". |
| Ainsi on utilisera : | Ainsi on utilisera : |
| |
| <code>ls -la | tee fichier | wc -l</code> | <code bash>ls -la | tee fichier | wc -l</code> |
| |
| ==== Présentation de "&" ==== | ==== Présentation de "&" ==== |
| Cet opérateur permet de lancer simultanément deux commandes dont la première sera lancée en arrière plan. Par exemple : | Cet opérateur permet de lancer simultanément deux commandes dont la première sera lancée en arrière plan. Par exemple : |
| |
| <code>ls & ls -la</code> | <code bash>ls & ls -la</code> |
| |
| {{icons:iconnote.png }} | {{icons:iconnote.png }} |
| Pour voir le code de retour de la dernière commande lancée : | Pour voir le code de retour de la dernière commande lancée : |
| |
| <code>echo $?</code> | <code bash>echo $?</code> |
| |
| L'opérateur "&&" permet de lancer une commande si et seulement si la première (celle à gauche de l'opérateur) s'est correctement terminée : | L'opérateur "&&" permet de lancer une commande si et seulement si la première (celle à gauche de l'opérateur) s'est correctement terminée : |
| |
| <code>ls && ls /</code> | <code bash>ls && ls /</code> |
| |
| Si la commande "ls" se termine correctement alors "ls /" sera exécutée. Un second exemple : | Si la commande "ls" se termine correctement alors "ls /" sera exécutée. Un second exemple : |
| |
| <code>fdgfdsg && ls</code> | <code bash>fdgfdsg && ls</code> |
| |
| ==== Présentation de "||" ==== | ==== Présentation de "||" ==== |
| C'est simplement l'inverse de "&&". La commande à droite de l'opérateur est exécutée seulement si le code de retour de la première commande est différent de 0 (donc s'il y a eu une erreur) : | C'est simplement l'inverse de "&&". La commande à droite de l'opérateur est exécutée seulement si le code de retour de la première commande est différent de 0 (donc s'il y a eu une erreur) : |
| |
| <code>fhgfdsjk || ls</code> | <code bash>fhgfdsjk || ls</code> |
| |
| Dans ce cas "ls" sera exécuté. | Dans ce cas "ls" sera exécuté. |
| Pour commencer nous allons chercher grâce à elles des mots dans le dictionnaire /usr/share/dict/french, malheureusement celui-ci a des problèmes d'accents, on va donc le convertir en un fichier où l'on pourra lire les accents : | Pour commencer nous allons chercher grâce à elles des mots dans le dictionnaire /usr/share/dict/french, malheureusement celui-ci a des problèmes d'accents, on va donc le convertir en un fichier où l'on pourra lire les accents : |
| |
| <code>iconv -f ISO-8859-15 -t UTF-8 /usr/share/dict/french > /tmp/french.utf8</code> | <code bash>iconv -f ISO-8859-15 -t UTF-8 /usr/share/dict/french > /tmp/french.utf8</code> |
| |
| Pour plus d'informations sur iconv, voir la page du manuel. Maintenant notre dictionnaire est /tmp/french.utf8 . | Pour plus d'informations sur iconv, voir la page du manuel. Maintenant notre dictionnaire est /tmp/french.utf8 . |
| Nous allons chercher les mots qui finissent par -er, pour cela on parcourt le fichier avec grep et on ne sort que les lignes finissant par -er : | Nous allons chercher les mots qui finissent par -er, pour cela on parcourt le fichier avec grep et on ne sort que les lignes finissant par -er : |
| |
| <code>grep 'er$' /tmp/french.utf8</code> | <code bash>grep 'er$' /tmp/french.utf8</code> |
| |
| L'opérateur **$** indique donc la **fin de ligne**. | L'opérateur **$** indique donc la **fin de ligne**. |
| Maintenant on désire chercher les mots commençant par absol- : | Maintenant on désire chercher les mots commençant par absol- : |
| |
| <code>grep '^absol' /tmp/french.utf8</code> | <code bash>grep '^absol' /tmp/french.utf8</code> |
| |
| L'opérateur **^** indique le **début d'une ligne**. | L'opérateur **^** indique le **début d'une ligne**. |
| On cherche maintenant les mots de 4 caractères commençant et finissant par un t, pour cela on utilise l'opérateur "**.**" qui remplace n'importe quel caractère, il est parfois appelé **wildcard** : | On cherche maintenant les mots de 4 caractères commençant et finissant par un t, pour cela on utilise l'opérateur "**.**" qui remplace n'importe quel caractère, il est parfois appelé **wildcard** : |
| |
| <code>grep '^t..t$' /tmp/french.utf8</code> | <code bash>grep '^t..t$' /tmp/french.utf8</code> |
| |
| Pour avoir exactement la ligne contenant "coucou", qui doit donc commencer et finir par coucou : | Pour avoir exactement la ligne contenant "coucou", qui doit donc commencer et finir par coucou : |
| |
| <code>grep '^coucou$' /tmp/french.utf8</code> | <code bash>grep '^coucou$' /tmp/french.utf8</code> |
| |
| ==== Les modificateurs ==== | ==== Les modificateurs ==== |
| Par exemple si l'on cherche les mots commençant par "t" et finissant par "tant" : | Par exemple si l'on cherche les mots commençant par "t" et finissant par "tant" : |
| |
| <code>grep '^t.*tant$' /tmp/french.utf8</code> | <code bash>grep '^t.*tant$' /tmp/french.utf8</code> |
| |
| "^t" nous donne les mots commençant par "t", "tant$" prends ceux finissant par "tant" et au milieu on veut 0 ou plus fois n'importe quel caractère, donc le ".". | "^t" nous donne les mots commençant par "t", "tant$" prends ceux finissant par "tant" et au milieu on veut 0 ou plus fois n'importe quel caractère, donc le ".". |
| On veut maintenant chercher les mots contenant "m" ou "mm", pour cela on va utiliser une expression régulière étendue, il faudra donc utiliser l'option "-E" de grep : | On veut maintenant chercher les mots contenant "m" ou "mm", pour cela on va utiliser une expression régulière étendue, il faudra donc utiliser l'option "-E" de grep : |
| |
| <code>grep -E 'm{1,2}' /tmp/french.utf8</code> | <code bash>grep -E 'm{1,2}' /tmp/french.utf8</code> |
| |
| Remarque : cette expression donne les mots contenant 1 ou 2 m consécutifs ou non. | Remarque : cette expression donne les mots contenant 1 ou 2 m consécutifs ou non. |
| Pour être toujours plus fou, on veut maintenant trouver tous les noms finissant par "eux" ou "eut" pour créer des noms de domaines en ".eu". Pour cela on prend les mots qui commencent par n'importe quoi grâce à "^.*", puis qui terminent par "x" ou "t" grâce à "[xt]", tout ça avec "eu" au milieu bien sûr : | Pour être toujours plus fou, on veut maintenant trouver tous les noms finissant par "eux" ou "eut" pour créer des noms de domaines en ".eu". Pour cela on prend les mots qui commencent par n'importe quoi grâce à "^.*", puis qui terminent par "x" ou "t" grâce à "[xt]", tout ça avec "eu" au milieu bien sûr : |
| |
| <code>grep '^.*eu[xt]$' /tmp/french.utf8</code> | <code bash>grep '^.*eu[xt]$' /tmp/french.utf8</code> |
| |
| On peut ainsi chercher les jeux pour KDE et pour GNOME, en supposant que tout jeu pour KDE qui se respecte commence par un "k" et par "g" pour GNOME. Pour cela on cherche tous les jeux, et on ne garde que ceux qui commencent par "k" ou "g" : | On peut ainsi chercher les jeux pour KDE et pour GNOME, en supposant que tout jeu pour KDE qui se respecte commence par un "k" et par "g" pour GNOME. Pour cela on cherche tous les jeux, et on ne garde que ceux qui commencent par "k" ou "g" : |
| |
| <code>apt-cache search games | grep '^[gk]'</code> | <code bash>apt-cache search games | grep '^[gk]'</code> |
| |
| Maintenant on veut chercher les jeux qui ne commencent ni par "g" ni par "k" : | Maintenant on veut chercher les jeux qui ne commencent ni par "g" ni par "k" : |
| |
| <code>apt-cache search games | grep '^[^gk].*' | grep -v '^lib'</code> | <code bash>apt-cache search games | grep '^[^gk].*' | grep -v '^lib'</code> |
| |
| Comme on l'a déjà vu [^gk] retourne ce qui commence par un "g" ou un "k", le "^" devant l'expression **[]** joue le rôle de **négation** : on prends ceux qui ne commencent ni par "g" ni par "k". Puis grâce à ".*" on accepte n'importe quelle fin. Mais cette requête renvoie beaucoup trop de résultats, on effectue donc un deuxième filtrage en éliminant ceux qui commencent par "lib" grâce à l'option -v de grep qui enlève les lignes correspondant à la condition. | Comme on l'a déjà vu [^gk] retourne ce qui commence par un "g" ou un "k", le "^" devant l'expression **[]** joue le rôle de **négation** : on prends ceux qui ne commencent ni par "g" ni par "k". Puis grâce à ".*" on accepte n'importe quelle fin. Mais cette requête renvoie beaucoup trop de résultats, on effectue donc un deuxième filtrage en éliminant ceux qui commencent par "lib" grâce à l'option -v de grep qui enlève les lignes correspondant à la condition. |
| Autre exemple instructif : | Autre exemple instructif : |
| |
| <code>ls / | grep -E '^m(edia|root)'</code> | <code bash>ls / | grep -E '^m(edia|root)'</code> |
| |
| Les parenthèses permettent d'isoler un regroupement, et le | correspond à "où". Ceci renvoie donc les fichiers/dossiers à la racine commençant par media ou mroot. | Les parenthèses permettent d'isoler un regroupement, et le | correspond à "où". Ceci renvoie donc les fichiers/dossiers à la racine commençant par media ou mroot. |
| Alors que : | Alors que : |
| |
| <code>ls / | grep -E '^media|root'</code> | <code bash>ls / | grep -E '^media|root'</code> |
| |
| renvoie les fichiers/dossiers commençant par media ou par root. | renvoie les fichiers/dossiers commençant par media ou par root. |
| |
| L'utilisation de cet outil se fait comme ceci : | L'utilisation de cet outil se fait comme ceci : |
| <code>echo "du texte" | sed 's/(qui)/(parquoi)'</code> | <code bash>echo "du texte" | sed 's/(qui)/(parquoi)'</code> |
| |
| Ex : Pour remplacer la premiere occurence : | Ex : Pour remplacer la premiere occurence : |
| |
| <code>echo "jean.durand@gmail.com" | sed 's/@/ at /' | sed 's/\./ pOiNt /'</code> | <code bash>echo "jean.durand@gmail.com" | sed 's/@/ at /' | sed 's/\./ pOiNt /'</code> |
| |
| renvoie : | renvoie : |
| |
| <code>jean pOiNt durand at gmail.com</code> | <code bash>jean pOiNt durand at gmail.com</code> |
| |
| On remplace le "." par " pOiNt " et le "@" par " at ", on voit ici que l'on a mis "\" devant le ".", le "\" est le caractère d'échappement : le "." est alors considéré comme le caractère ".". | On remplace le "." par " pOiNt " et le "@" par " at ", on voit ici que l'on a mis "\" devant le ".", le "\" est le caractère d'échappement : le "." est alors considéré comme le caractère ".". |
| De même si on veut remplacer "/" par "slash", on utiliserait | De même si on veut remplacer "/" par "slash", on utiliserait |
| |
| <code>s/\// slash /</code> | <code bash>s/\// slash /</code> |
| |
| On peut faire la même chose en moins long en utilisant l'autre version de sed: | On peut faire la même chose en moins long en utilisant l'autre version de sed: |
| |
| <code>echo "jean.durand@gmail.com" | sed -e 's/@/ at /' -e 's/\./ pOiNt /'</code> | <code bash>echo "jean.durand@gmail.com" | sed -e 's/@/ at /' -e 's/\./ pOiNt /'</code> |
| |
| Pour toute les occurrences ,on peut aussi utiliser : | Pour toute les occurrences ,on peut aussi utiliser : |
| <code>s///g</code> | <code bash>s///g</code> |
| oû : | oû : |
| <code>echo "jean.durand@gmail.com" | sed -e 's/@/ at /' -e 's/\./ pOiNt /g'</code> | <code bash>echo "jean.durand@gmail.com" | sed -e 's/@/ at /' -e 's/\./ pOiNt /g'</code> |
| qui donnera : | qui donnera : |
| <code>jean pOINT durand at gmail pOINT com</code> | <code bash>jean pOINT durand at gmail pOINT com</code> |
| |
| On peut de même l'appliquer sur des fichiers : | On peut de même l'appliquer sur des fichiers : |
| |
| <code>sed 's/kikoo/#kikoolol/g' /etc/config.txt</code> | <code bash>sed 's/kikoo/#kikoolol/g' /etc/config.txt</code> |
| |
| Ceci remplace toute occurrence de "kikoo" par "#kikoolol" dans le fichier /etc/config.txt mais ne le modifie pas, le résultat est donné sur la sortie standard. Pour modifier le fichier il faut ajouter l'option -i à sed. | Ceci remplace toute occurrence de "kikoo" par "#kikoolol" dans le fichier /etc/config.txt mais ne le modifie pas, le résultat est donné sur la sortie standard. Pour modifier le fichier il faut ajouter l'option -i à sed. |
| On peut enfin spécifier l’occurrence à remplacer : | On peut enfin spécifier l’occurrence à remplacer : |
| |
| <code>echo "moimoimoi" | sed 's/moi/toi/3'</code> | <code bash>echo "moimoimoi" | sed 's/moi/toi/3'</code> |
| |
| Donne : | Donne : |
| |
| <code>moimoitoi</code> | <code bash>moimoitoi</code> |
| |
| <note warning>l'action de l'option /n (n=1,2,3...) et /g sur un fichier n'est pas identique | <note warning>l'action de l'option /n (n=1,2,3...) et /g sur un fichier n'est pas identique |
| Nous allons maintenant voir l'utilisation de variables avec sed ce qui permet d'échanger, de déplacer des parties d'une chaîne de caractères. Exemple : | Nous allons maintenant voir l'utilisation de variables avec sed ce qui permet d'échanger, de déplacer des parties d'une chaîne de caractères. Exemple : |
| |
| <code>echo "jean.durand" | sed -r 's/(.*)\.(.*)/\2.\1/'</code> | <code bash>echo "jean.durand" | sed -r 's/(.*)\.(.*)/\2.\1/'</code> |
| |
| (.*) représente l'affectation des variables et \n la n-ième variable, ici on met donc ce qu'il y a avant le point ("\.") dans \1 et ce qu'il y a après dans \2 puis on met \2 devant \1, on obtient : | (.*) représente l'affectation des variables et \n la n-ième variable, ici on met donc ce qu'il y a avant le point ("\.") dans \1 et ce qu'il y a après dans \2 puis on met \2 devant \1, on obtient : |
| |
| <code>durand.jean</code> | <code bash>durand.jean</code> |
| |
| Pour terminer nous allons voir un exemple pratique : nous avons de nombreux dossiers contenant de nombreux mp3 nommés selon le schéma Knoklezout_au_taquet-Jamendo-David_TMX.mp3 et on désire avoir le nom d'artiste avant le titre de la chanson tout en enlevant la publicité pour Jamendo. | Pour terminer nous allons voir un exemple pratique : nous avons de nombreux dossiers contenant de nombreux mp3 nommés selon le schéma Knoklezout_au_taquet-Jamendo-David_TMX.mp3 et on désire avoir le nom d'artiste avant le titre de la chanson tout en enlevant la publicité pour Jamendo. |
| Pour cela nous allons utiliser **rename** (qui vient avec perl) et nos chères expressions régulières : | Pour cela nous allons utiliser **rename** (qui vient avec perl) et nos chères expressions régulières : |
| |
| <code>rename 's/^(.*)-Jamendo-(.*)\.mp3/$2_-_$1.mp3/' *.mp3</code> | <code bash>rename 's/^(.*)-Jamendo-(.*)\.mp3/$2_-_$1.mp3/' *.mp3</code> |
| |
| Le principe est le même qu'avec sed sauf que les variables sont notées $n et non plus \n : on met ce qu'il y a avant "-Jamendo-" dans $1 et ce qu'il y a après (".mp3" non compris) dans $2 puis on formate comme on le veut. | Le principe est le même qu'avec sed sauf que les variables sont notées $n et non plus \n : on met ce qu'il y a avant "-Jamendo-" dans $1 et ce qu'il y a après (".mp3" non compris) dans $2 puis on formate comme on le veut. |