Professional Documents
Culture Documents
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.
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 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.
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 "-".
$ 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
$ 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.
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
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.
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 :
…\(…\)…\(…\)…
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.
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.
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
Le deuxième exemple affecte le shell sh à tous les utilisateurs de ksh, csh ou rsh.
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 **.
Ce deuxième exemple vise à supprimer une partie du fichier depuis la ligne 16 jusqu'à la
prochaine ligne vide (/^$/).
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.
Ce deuxième exemple vise à afficher les lignes d'un fichier contenant l'expression régulière
"Mar".
sed '/^end$/a\
> /************/' fichier > newfichier
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,
: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.
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).