You are on page 1of 11

Systèmes répartis UNIX Serveur Filtre SED

Filtre SED

11/10/09 23243495.doc Page 1 sur 11


Systèmes répartis UNIX Serveur Filtre SED

Chapitre X : Filtre SED

Introduction
Le filtre sed (stream editor ) est un filtre programmable. Cela lui confère un caractère généraliste
que les filtres traditionnels n'ont pas. On peut, avec sed, réaliser un large éventail de
manipulations de texte.

Le filtre sed hérite de la plupart des commandes de l'éditeur de texte ed (ancêtre de l'éditeur VI) .
Il reste un éditeur non interactif qui possède son propre environnement de programmation.
Cette commande permet d'appliquer un certain nombre de commandes sur un fichier puis d'en
afficher le résultat (sans modification du fichier de départ) sur la sortie standard.

Ces commandes d'édition (ou séquences d'instruction) agissent sur les différentes lignes du
fichier à traiter.

La maîtrise du filtre sed réside dans la connaissance et l'écriture des expressions régulières, tout
autant que dans les commandes d'édition.

Certaines opérations réalisées avec sed, peuvent être effectuées par d'autres filtres tels que grep,
tail ou head. Les utilisateurs doivent employer les outils qui leur conviennent le mieux.

1. Syntaxe
1.1. Généralités
Dans sa forme la plus simple, l'utilisateur fournit la commande d'édition en premier argument de
la ligne de commande, puis le nom du fichier à traiter en deuxième argument.

sed 'commande d'édition' [fichier à traiter ]

Remarque
Compte tenu des symboles utilisés dans la commande d'édition, il est conseillé de toujours
protéger la commande en utilisant des quotes simples « ' » plutôt que des double quotes (ou
guillemets).

La syntaxe complète peut prendre l'une des deux formes suivantes :

sed [ -n ] [ -e Script ... ] [ Fichier(s) à traiter]


sed [ -n ] [ -f Fichier SED ] [ Fichier(s) à traiter]

11/10/09 23243495.doc Page 2 sur 11


Systèmes répartis UNIX Serveur Filtre SED

La syntaxe de cette commande comprend non seulement des options suggérées dans les modèles
ci-dessus, mais aussi et surtout des commandes d'édition regroupées au sein de scripts.
Ces scripts peuvent directement être saisis lors du lancement de la commande SED. Ces scripts
sont alors entourés de simples quotes et précédés de l'option -e. Ils peuvent aussi provenir d'un
fichier externe SED précédé de l'option -f.
Quand le nombre d'instructions devient trop important et nuit à la lisibilité de la ligne, ou si les
mêmes instructions doivent être utilisées dans plusieurs commandes sed distinctes, il est plus
simple de créer un fichier, un script sed, que l'on donne en argument, via l'option -f, dans la ligne
de commandes.

1.2. Options
Les options principales sont au nombre de trois :
• -n n'affiche pas le fichier traité.
Par défaut, la commande affiche tout le fichier traité. Cette option associée à la
commande d'édition "p" (print) permet de n'afficher que les lignes ou
enregistrements modifiés par le filtre.

• -e précède la déclaration d'un script d'édition à appliquer sur le fichier.


Cette option est utile lorque plusieurs scripts sont appliqués.

• -f précède le nom du fichier de script externe.

Sans –e ou –f, le premier argument est interprété comme un script, les autres arguments
représentent les fichiers à traiter (fichiers d'entrée).

Sans fichier d'entrée, la lecture se fait sur l'entrée standard. Il est possible de spécifier l'entrée
standard par "-".

Voici deux exemples illustrant les propos de cette partie.


Le premier exemple vise à remplacer dans le fichier "fic1" les "1" par des "un" à l'aide d'une
commande de substitution déjà évoquée dans le chapitre portant sur l'éditeur VI.
$ more fic1
1 cheval couronné
1 âne le fait rire

$ sed 's/l/un/g' fic1 > fic2

$ mv fic2 fic1

$ more fic1
un cheval couronné
un âne le fait rire
11/10/09 23243495.doc Page 3 sur 11
Systèmes répartis UNIX Serveur Filtre SED

Le deuxième exemple montre la possibilité d'utiliser deux filtres d'édition dans la même
commande.

$ more fic1
un cheval couronné
un âne le fait rire

$ sed -e 's/u/U/g' -e 's/a/A/g' fic1

$ more fic1
Un chevAl coUronné
Un âne le fAit rire

Les deux filtres de cet exemple peuvent être déportés vers deux lignes d'un fichier externe
comme le montre le troisième exemple.

$ cat > prog


s/u/U/g
s/a/A/g
^D
$ sed -f prog fic1

1.3. Zone de Travail


Les adresses peuvent définir la zone de travail (pattern space) du fichier à traiter.
Sans adresse, la commande SED applique le filtre d'édition sur toutes les lignes du fichier.
Cette addresse est uniquement constituée par le numéro de ligne :
• "0" aussi bien que "1" désigne la 1ère ligne,
• "$" la dernière ligne,
• "num1,num2" représente l'ensemble des lignes comprises entre les lignes num1 et num2
• /RE/ restreint la zone de travail aux lignes contenant l'expression régulière RE
• /RE1/,/RE2/ délimite la zone de travail entre la première ligne contenant l'expression
régulière RE1 et la première ligne contenant l'expression régulière RE2
• /chaîne1/~chaîne2/ peut correspondre à plusieurs groupes de lignes dans un fichier.

1.4. Critères de Recherche


Les motifs (ou pattern), définissant les critères de recherche ou de remplacement, sont par
défaut de la forme /pattern/, donc entourées par des barres obliques "/" (ou slash).

Rappelons que les expressions régulières sont des modèles de chaîne qui, plutôt que de définir
11/10/09 23243495.doc Page 4 sur 11
Systèmes répartis UNIX Serveur Filtre SED

complètement un texte, n'en donnent qu'une forme générique.

Métacaractères
Le tableau qui suit rappelle et complète le tableau des symboles ou métacaractères usuellement
employées dans les expressions régulières utilisées dans l'élaboration des filtres.

"." Il désigne n'importe quel caractère.


"*" Il agit comme caractère de répétition du caractère qui le précède.
"^" Il précède le 1er caractère de la ligne.
"$" Il suit le dernier caractère de la ligne.
"~" Il précède le motif dont on cherche l'occurrence, quel que soit l'endroit où
il est sur la ligne.
[ListedeCaractères] Ce critère multirecherche permet de remplacer un des caractères de la liste.
[^ListedeCaractères] Ce critère multirecherche permet de modifier les caractères qui
n'appartiennent pas à la liste.
\Car Le caractère "Car" perd la signification particulière qu'il a normalement
dans une expression régulière. La séquence \* désigne le caractère *.
"=" Il affiche le numéro de ligne.
"&" Il évite de reécrire le motif défini juste avant comme critère de recherche
dans le motif de remplacement.

Les touches de contrôle peuvent aussi être sollicités pour la mise en forme de l'affichage :
• "\n" ajoute un saut de ligne et retour en début de ligne, etc…

Les sous-expressions
Principe.
La commande de substitution "s" a un usage plus général que le remplacement de chaînes de
caractères. Elle permet, grâce aux sous-expressions, de recomposer la ligne de texte.
Une sous-expression est une partie d'expression régulière que l'on souhaite réutiliser dans la
chaîne de remplacement.

Syntaxe
Commande: sed 's/chaîne1/chaîne2/'

Chaine1 générique présentant deux sous-expressions encadrées par des parenthèses protégées :
…\(…\)…\(…\)…

Chaine2 générique dont les nombres correspondent aux sous-expressions successives de la


chaine1 :
…\1…\2

Une sous-expression est encadrée par des parenthèses protégées. Dans la chaîne de
remplacement, on indique le numéro de 1a sous-expression: \1 désigne la première
sous-expression, \2 la seconde, et ainsi de suite.

11/10/09 23243495.doc Page 5 sur 11


Systèmes répartis UNIX Serveur Filtre SED

Exemple

$ more f2
un,deux,troix
one two.three

$ sed 's/\(.*),.*,\(.*\)/\1:\2/' f2
un: trois
one: three

La lecture d'une instruction sed qui utilise les sous-expressions est difficile. Un utilisateur
confirmé doit cependant savoir les déchiffrer ; elles sont fréquemment utilisées, dans les scripts
de base d'un système UNIX.

1.5. Commandes d'édition


Les commandes d'édition énumérées ci-dessous ne sont sans doute exhaustives mais donnent un
bon aperçu de ce que l'on peut faire avec ces filtres.

s/chaine1/chaine2/gpw Caractères de "chaine1" substitués par ceux de "chaîne2",


toutes occurrences de la ligne ("g"), substitutions affichées
("p"), remplacés à la même position.
y/chaine1/chaine2/ Caractères remplacés à la même position.
a\ texte (à la ligne) Cette commande ajoute le texte qui suit. Le texte en question
est inséré de préférence à la ligne suivante.
i\ texte (à la ligne) Idem pour cette commande qui insère du texte.
c\ texte (à la ligne) Idem pour cette commande qui remplace les lignes
sélectionnées.
"d" ou "D" Supprime le motif précisé avant de la zone de travail.
"p" Affiche la zone de travail modifiée.
: étiquette Définition d'une étiquette.
"b" ou "t" Si une commande d'édition type "s" réussit, alors un
branchement sur l'étiquette défini au préalable est réalisé.
!cde La négation "!" présente devant la commande style "p"
entraîne que cette dernière est exécutée en dehors de la zone
de travail définie juste avant.
"r" fichier Lit et affiche le texte du fichier indiqué en argument.
"w" fichier Ecrit dans le fichier indiqué en argument en plus de l'affichage
sur la sortie standard.
"q" La présence de cette commande optionnelle, en général à la
fin du script, force la terminaison de la commande "sed".
{n,N} Lit et ajoute la ligne suivante.

11/10/09 23243495.doc Page 6 sur 11


Systèmes répartis UNIX Serveur Filtre SED

2. Exemples
Remarques préalables :

1. Dans l'introduction, il a été annoncé que le filtre ne modifiait pas le fichier traité. En
conséquence, si l'utilisateur veut garder une trace du traitement du filtre, il doit rediriger la
sortie standard de la commande sed vers un autre fichier. Pour terminer, il peut effacer
l'ancien et renommer le nouveau, ce que font la plupart des scripts.
sed … fichier > nouveau-fichier
rm fichier ; mv nouveau-fichier fichier

2. La saisie du script d'édition peut s'effectuer sur plusieurs lignes pour des raisons de lisibilité.
Dans ce cas, la première ligne comporte le nom de la commande, ses options ainsi que la 1ère
quote débutant le script. Alors l'interpréteur de commandes propose l'invite secondaire « > »
(ou variable d'environnement PS2). Une fois que l'utilisateur a terminé l'écriture du filtre sur
plusieurs lignes, la commande doit terminer par le nom du fichier à traiter. L'utilisateur sort
du prompt secondaire et valide la commande SED en saisissant "^D".

$ sed '
> s/u/U/g' fic1 > newfic1
> ^D
$ more newfic1

2.1 Commande de remplacement


La commande "s" (substitue) s/chaînel/chaîne2/[g] qui illustre le premier exemple est, sans
conteste, la commande la plus utilisée du filtre SED. Elle remplace dans chaque ligne, la
première occurrence de chaînel="unix" ou "Unix" par chaîne2="UNIX". Toutes les chaînes
chaînel sont remplacées si l'attribut g (global) est ajouté.

$ sed 's/[uU]nix/UNIX/g' fichier > newfichier

Le deuxième exemple affecte le shell sh à tous les utilisateurs de ksh, csh ou rsh.

$ sed 's/\/[kcr]sh$/\/sh/' /etc/passwd

Le troisième exemple ajoute "ligne:" en début de chaque ligne.

$ sed 's/^/ligne:/' fic1

Le quatrième exemple oblige l'utilisateur à maîtriser la lecture des expressions régulières. Il s'agit
ici d'encadrer le premier nombre de la ligne avec des **.

11/10/09 23243495.doc Page 7 sur 11


Systèmes répartis UNIX Serveur Filtre SED

$ sed -e "s/\([0-9][0-9]*\)/**\1**/" fichier

2.2 Commande de suppression


Le fichier nvfichier a le même contenu que le fichier origine sans la dernière ligne du fichier.

$ sed '$d' fichier > nvfichier

Ce deuxième exemple vise à supprimer une partie du fichier depuis la ligne 16 jusqu'à la
prochaine ligne vide (/^$/).

sed '16,/^$/d' fichier > nvfichier

Ce troisième exemple a pour but d'effacer tout les lignes du fichier sauf celles commençant par
From. Ceci revient à afficher les lignes commençant par From.

sed "/^From/!d" fichier

2.3 Commande d'affichage de la zone de travail


Cette commande simplement affiche les trois première lignes du fichier.

sed -n '3p' fichier

Ce deuxième exemple vise à afficher les lignes d'un fichier contenant l'expression régulière
"Mar".

sed -n '/Mar/p' dep

2.4 Commande d'ajoût


Cet exemple vise à ajouter une ligne comportant le texte "/**…" après chaque ligne contenant le
motif "end".

sed '/^end$/a\
> /************/' fichier > newfichier

11/10/09 23243495.doc Page 8 sur 11


Systèmes répartis UNIX Serveur Filtre SED

2.5 Commandes de terminaison et d'écriture


Le fichier d'entrée qui suit permet de présenter deux exemples : un sur la commande de
terminaison "q", un sur un filtre double écrivant dans un fichier externe.

Le résultat du premier affiche les 2 premières lignes du fichier puis arrête la commande.
Le résultat du deuxième consiste au niveau du 1er filtre à afficher sur une ligne le numéro de la
ligne qui suit, au niveau du 2ème filtre à écrire les lignes possédant une majuscule dans un autre
fichier.
$ cat fichier
Un,
deux.
Trois,
quatre.
$ sed -e '2q' fichier
Un,
deux.
$ sed -e "/\./=/" -e "/[A-Z]/w capitale" fichier
Un,
2
deux.
Trois,
4
quatre.
$ cat capitale
Un,
Trois,

2.6 Commande SED comme filtre d'une commande de préparation


d'impression
La commande pr précède l'emploi du filtre SED. Ceci a pour but d'insérer les numéros de page
entre parenthèses avant l'impression du fichier "chap2" (commande "lpr"). La commande "pr"
met un numéro de page au sommet de chaque page. La sous-commande "s" change par exemple
l'expression « Page 1 » en « (Page 1) », où & reprend le motif précédemment décrit.

pr chap2 | sed "s/Page *[0-9]*$/(&)/" | lpr

2.7 Script SED avec saut sur étiquette


Il s'agit d'un script externe relativement élaboré. Ce script relie chaque ligne qui se termine par
11/10/09 23243495.doc Page 9 sur 11
Systèmes répartis UNIX Serveur Filtre SED

"\" à la ligne suivante.


Il commence par définir une étiquette ":join" où "join" est le nom donné à cette étiquette. Puis il
définit le critère de recherche avant de définir l'action à exercer sur ce critère rencontré. Un
traitement en boucle est alors instauré pour traiter tout le fichier.

:join
/\\$/ {N
s/\\/\n/
b join
}

D'abord, l'expression "/\\$/" choisit une ligne qui se termine par "\" pour le groupe de
commandes inclus entre {}, le 1er "\" annihilant celui qui suit.
La sous-commande N ajoute ensuite la ligne suivante, insérant un RC (\n). L'expression s/\\/\n/
supprime "\" et insère un RC.
Finalement, la sous-commande "b" branche le script vers l'étiquette ":join" pour vérifier la
présence du "\" en fin de ligne jointe. Sans ce branchement, la commande écrit la ligne jointe et
lit la suivante avant de vérifier un second "\".
Note: la sous-commande N s'arrête s'il n'y a plus de lignes en entrée. Elle ne copie pas l'espace
de travail vers la sortie standard avant de s'arrêter. Si la dernière ligne d'entrée contient un "\",
celle-ci n'est pas copiée vers la sortie.

Conclusion
Ce chapitre n'est certes pas complet en ce qui concerne les fonctionnalités de ce filtre. Il permet
néanmoins d'en faire une présentation solide et d'évaluer la puissance relative de ces possibilités.

L'utilisateur qui maîtrise l'éditeur SED est en mesure d'écrire des scripts d'administration de
qualité qui lui permettront de mieux mesurer les performances de son système UNIX et donc
d'en affiner la gestion. Une fois que l'environnement de programmation de l'éditeur SED est
maîtrisé, l'utilisateur peut évoluer sans appréhension vers le langage AWK.

L'étude de ce chapitre souligne l'importance de la maîtrise des expressions régulières pour


utiliser au mieux ce filtre. Il existe des similitudes dans leur utilisation quel que soit le système
d'exploitation. L'administrateur ainsi gère en profondeur les performances et les services de ce
dernier.

Tous les livres et sites web consacrés au langage de commandes shell sous UNIX évoquent, ne
seraient-ce que pour les définitions, le filtre SED et le langage complémentaire AWK qui en est
issu.

La dernière version dans le monde GNU en est la version 3.02 (Juin 1998) à l'adresse
http://www.gnu.org/manual/sed-3.02/html_mono/sed.html.
11/10/09 23243495.doc Page 10 sur 11
Systèmes répartis UNIX Serveur Filtre SED

Bibliographie :
• Sed and Awk. Unix Power Tools, O'Reilly 2è édition de Dale Dougherty et Arnold
Robbins (1997).

11/10/09 23243495.doc Page 11 sur 11

You might also like