Les commandes ed, vi, ex, sed, awk, expr et grep utilisent les expressions régulières.
L'exemple le plus simple d'une expression régulière est une chaîne de caractères quelconque toto par exemple. Cette simple expression régulière va identifier la prochaine ligne du fichier à traiter contenant une chaîne de caractère correspondant à l'expression régulière.
Si l'on veut chercher une chaîne de caractère au sein de laquelle se trouve un caractère spécial (/, *, $, ., [, ], {, }, !, entre autres) (appelé aussi métacaractère), on peut faire en sorte que ce caractère ne soit pas interprété comme un caractère spécial mais comme un simple caractère. Pour cela vous devez le faire précéder par \ (backslash). Ainsi si votre chaîne est /dev, pour que le / ne soit pas interprété comme un caractère spécial, vous devez tapez \ /dev pour l'expression régulière.
D'une manière plus générale voici comment [] peuvent être utilisés.
[A-D] intervalle de A à D (A, B, C, D) par exemple bof[A-D] donne bofA, bofB, bofC, bofD
[2-5] intervalle de 2 à 5 (2, 3, 4, 5) par exemple 12[2-5]2 donne 1222, 1232, 1242, 1252
[2-56] intervalle de 2 à 5 et 6 (et non pas 56) (2, 3, 4, 5, 6) par exemple 12[2-56]2 donne 1222, 1232, 1242, 1252, 1262
[a-dA-D] intervalle de a à d et A à D (a, b, c, d, A, B, C, D) par exemple z[a-dA-D]y donne zay, zby, zcy, zdy, zAy, zBy, zCy, zDy
[1-3-] intervalle de 1 à 3 et - (1, 2, 3, -) par exemple [1-3-]3 donne 13, 23, 33, -3
[a-cI-K1-3] intervalle de a à c, I à K et 1 à 3 (a, b, c, I, J, K, 1, 2, 3)
On peut utiliser [] avec un pour identifier le complèment de l'expression régulière. En français pour identifier l'opposé de l'expression régulière. Vous avez toujours pas compris ? Voici un exemple: [^0-9]toto identifie les lignes contenant une chaîne toto, le caractère juste avant ne doit pas être un chiffre (exemple atoto, gtoto mais pas 1toto, 5toto). Autre exemple [^a-zA-Z] n'importe quel caractère sauf une lettre minuscule ou majuscule. Attention à la place de ^, si vous tapez [1-3^], c'est équivalent aux caractères 1, 2, 3 et ^.
Le métacaractère $ identifie une fin de ligne. Par exemple l'expression régulière a$ va identifier les lignes se terminant par le caractère a.
L'expression régulière ^chaine$ identifie les lignes qui contiennent strictement la chaîne chaine.
L'expression régulière ^$ identifie une ligne vide.
L'expression régulière a* correspond aux lignes comportant 0 ou plusieurs caractère a. Son utilisation est à proscrire, car toutes les lignes, même celles ne contenant pas le caractère a, répondent aux critères de recherche. x* est une source de problèmes, il vaut mieux éviter de l'employer.
L'expression régulière aa* correspond aux lignes comportant 1 ou plusieurs caractères a.
L'expression régulière .* correspond à n'importe quelle chaîne de caractères.
L'expression régulière [a-z][a-z]* va chercher les chaînes de caractères contenant 1 ou plusieurs lettres minuscules (de a à z).
L'expression régulière [^ ][^ ]* est équivalent à tout sauf un blanc.
Par exemple \ ([a-z][a-z]*)\ est une sous chaîne identifiant les lignes contenant une ou plusieurs lettres minuscules, pour faire appel à cette sous chaîne, on pourra utiliser \ 1. Voir dans le paragraphe sed pour un exemple.
sed est une évolution de l'éditeur ed lui même précurseur de vi, la syntaxe n'est franchement pas très conviviale, mais il permet de réaliser des commandes complexes sur des gros fichiers.
La syntaxe de sed est la suivante:
sed -e 'programme sed' fichier-a-traiterou
sed -f fichier-programme fichier-a-traiterVous disposez de l'option -n qui supprime la sortie standard par défaut, sed va écrire uniquement les lignes concernées par le traitement (sinon il écrit tout même les lignes non traitées). L'option -e n'est pas nécessaire quand vous avez une seule fonction d'édition.
La commande sed est une commande très riche, ne vous sont présentées ici que les fonctions les plus courantes, pour plus de détails faites un man sed et/ou man ed.
sed "s/toto/TOTO/" fichier va changer la première occurence de la chaîne toto par TOTO (la première chaîne toto rencontrée dans le texte uniquement)
sed "s/toto/TOTO/3" fichier va changer la troisième occurence de la chaîne toto par TOTO (la troisième chaîne toto rencontrée dans le texte uniquement)
sed "s/toto/TOTO/g" fichier va changer toutes les occurences de la chaîne toto par TOTO (toutes les chaînes toto rencontrées sont changées
sed "s/toto/TOTO/p" fichier en cas de remplacement la ligne concernée est affichée sur la sortie standard (uniquement en cas de substitution)
sed "s/toto/TOTO/w resultat" fichier en cas de substitution la ligne en entrée est inscrite dans un fichier résultat
La fonction de substitution peut évidemment être utilisée avec une expression régulière.
sed -e "s/[Ff]raise/FRAISE/g" fichier substitue toutes les chaînes Fraise ou fraise par FRAISE
sed "20,30d" fichierCette commande va supprimer les lignes 20 à 30 du fichier fichier. On peut utiliser les expressions régulières:
sed "/toto/d" fichierCette commande supprime les lignes contenant la chaîne toto. Si au contraire on ne veut pas effacer les lignes contenant la chaîne toto (toutes les autres sont supprimées), on tapera:
sed "/toto/!d" fichierEn fait les lignes du fichier d'entrée ne sont pas supprimées, elles le sont au niveau de la sortie standard.
La commande l (list) affiche la ligne sélectionnée sur la sortie standard avec en plus les caractères de contrôles en clair avec leur code ASCII (deux chiffres en octal).
La commande = donne le numéro de la ligne sélectionnée sur la sortie standard.
Ces trois commandes sont utiles pour le débogage, quand vous mettez au point vos programmes sed.
sed "/toto/=" fichierCette commande va afficher le numéro de la ligne contenant la chaîne toto.
La fonction r (read) lit le contenu d'un fichier et écrit le contenu sur la sortie standard.
La fonction w (write) écrit la ligne sélectionnée dans un fichier.
sed "/^toto/w resultat" fichierCette commande va écrire dans le fichier resultat toutes les lignes du fichier fichier commençant par la chaîne toto.
a\ le texteLa fonction i (insert) va placer un texte avant la ligne sélectionnée. La syntaxe est la suivante:
i\ le texteSi votre texte tient sur plusieurs lignes la syntaxe pour le texte est la suivante:
ligne 1 du texte\ ligne 2 du texte \ ligne n du texte \ dernière ligneConcrètement vous pouvez appeler la fonction i ou a dans un fichier de commande de sed. Par exemple, soit votre fichier prog.sed suivant:
1i\ début du traitement s/[tT]oto/TOTO/g $a \ fin du traitement\ de notre fichierOn exécute la commande en tapant:
sed -f prog.sed fichier-a-traiterprog.sed a pour effet d'inscrire avant la première ligne (1i) le texte "début de traitement", et après la dernière ligne ($a) le texte "fin du traitement (retour à la ligne) de notre fichier".
sed -e "s/\ ([0-9][0-9]*\ )/aa\ 1aa/" fichierLa sous expression (sous chaîne) \ ([0-9][0-9]*\) désigne un ou plusieurs chiffres, chacun sera entouré des caractères aa. La chaîne to2to deviendra toaa2aato.