sed, l'éditeur de flux (stream editor)
Description
sed est un éditeur de flux basé sur l’éditeur ed. Ses commandes sont très proches de celles de ce dernier, mais à la différence de ed, sed peut traiter un flux de données qu’il lit sur son entrée standard et écrit sur sa sortie standard. Il a été conçu dans le but d’être utilisé de façon non interactive avec des redirections : <, >, <<, >> et |. Il peut aussi lire des fichiers dont les noms lui sont passés en arguments.
Les commandes les plus fréquemment utilisées de sed sont les commandes de substitutions, mais il est également possible de l’utiliser pour ajouter, insérer, remplacer ou supprimer des lignes.
Cet éditeur, créé par Lee E. McMahon dans les laboratoires Bell (Bell Labs), probablement de 1973 à 1974, a fait son apparition dans UNIX version 7.
sed comporte de nombreuses fonctions que nous ne pouvons pas détailler dans cet ouvrage. Les lecteurs souhaitant approfondir le fonctionnement pourront se référer aux documents de référence suivants :
-
SED - A Non-interactive Text Editor, Lee E. McMahon, Bell Laboratories, Murray Hill, New Jersey 07974.
-
Les différentes pages de manuel de sed d’une version de distribution GNU/Linux, ou d’un système UNIX ou dérivé d’UNIX.
Rappels de fonctionnement
1. Principe de fonctionnement
sed est un éditeur de flux (Stream EDitor, en anglais). Il a été conçu pour traiter des données qu’il lit sur son entrée standard (stdin) ou dans un fichier, et écrit après traitement sur sa sortie standard. Il peut ainsi être utilisé en sortie d’une commande et en entrée d’une autre, grâce aux tubes de communication inter-processus (pipes, en anglais). Grâce à la puissance des shells, il peut donc être utilisé pour lire des données à traiter :
-
à partir d’un clavier,
-
à partir d’un fichier,
-
à partir d’une commande,
-
à partir d’un here-document (voir documentation du shell).
Les commandes qu’il doit exécuter peuvent lui être passées de plusieurs façons :
1. |
Sur la ligne de commande : |
|
a) |
sous forme d’un argument constitué de plusieurs directives séparées par un point-virgule (;), |
|
b) |
sous forme de plusieurs arguments, chacun précédé de l’option -e et constitué d’une ou plusieurs directives séparées par des points-virgules (;). |
|
2. |
Dans un fichier constitué d’un ensemble de directives, à raison d’une directive par ligne. |
Syntaxe
sed [options] [-e] commandes_sed [-e commandes_sed ...][fichier ...]
sed -f fichier_commandes_sed [fichier ...]
Exemple 1
sed 's/:/|/g' < /etc/group
Cette commande lit le fichier /etc/group sur son entrée standard grâce à une redirection du shell, puis remplace sur l’ensemble des lignes du fichier le caractère : par le caractère |.
Exemple 2
sed -f sed.cmds < /etc/group
Cette commande lit le fichier /etc/group sur son entrée standard grâce à une redirection du shell, puis exécute les commandes sed spécifiées dans le fichier sed.cmds.
2. Adressage des lignes
a. Principe d’adressage
Comme ed, sed est un éditeur ligne, et il faut lui spécifier la portée des lignes sur lesquelles vont être appliquées les commandes. Là encore, la portée doit précéder la commande à exécuter.
Il existe quelques différences d’interprétation entre...
Les expressions basiques
1. Utilisation du caractère ^
a. Signification
Le caractère ^ en début d’expression spécifie un début de ligne. À l’aide de ce caractère, il est possible de rechercher une chaîne en début de ligne, ou de remplacer une chaîne se trouvant en début de ligne par une autre chaîne (éventuellement vide). Les chaînes recherchées peuvent être exprimées sous forme de chaînes de caractères ou d’expressions régulières.
Si l’on recherche spécifiquement le caractère ^ dans une ligne, il faudra lui enlever son caractère générique en le faisant précéder d’un antislash.
b. Recherche d’une expression en début de ligne
Syntaxe
/^expr/
Exemple 1
sed -n '/^mysql:/p' /etc/passwd
Cette commande recherche dans le fichier /etc/passwd les chaînes commençant par la chaîne mysql: (/^mysql:/) et les affiche (p), c’est-à-dire qu’elle recherche dans le fichier /etc/passwd l’utilisateur mysql.
La commande suivante effectue la même opération mais utilise une redirection effectuée par le shell de l’entrée standard vers le fichier /etc/passwd. L’ouverture du fichier /etc/passwd est effectuée par le shell, et non par la commande sed :
< /etc/passwd sed -n '/^mysql:/p'
c. Insertion d’une chaîne en début de ligne
Syntaxe
s/^/chaîne_à_insérer/
Exemple
Supposons que l’on veuille commenter les lignes 15 à 26 d’un shell script, nommé test_sed01, en plaçant le caractère # en tête de ligne, et en plaçant le résultat dans un fichier nommé test_sed02 : on utilisera alors la commande suivante :
sed '15,26s/^/#/' < test_sed01 > test_sed02
qui doit être interprétée de la façon suivante :
-
15,26 donne la portée de la commande.
-
s appelle la commande de substitution.
-
/ introduit la première expression.
-
^ indique un début de ligne : c’est la première expression à substituer.
-
/ indique la fin de la première expression et le début...
Les expressions étendues
1. Avertissement
Les expressions régulières étendues ne sont pas disponibles dans la commande sed d’origine, ni dans de nombreuses variantes disponibles dans les systèmes dérivés d’UNIX. Elles sont disponibles dans la version de sed de la FSF (Free Software Foundation), disponible sur certaines versions de Linux, avec l’option --regexp-extended ou -r. Cette particularité de la commande sed de la FSF n’étant pas disponible sur toutes les plates-formes, elle devra être utilisée uniquement dans le cas où les commandes utilisées ne nécessitent pas d’être portées sur d’autres systèmes ne disposant pas de cette fonctionnalité étendue.
2. Utilisation du caractère .
Le métacaractère . dans une expression sert à désigner n’importe quel caractère, à l’exception du saut de ligne.
3. Utilisation des caractères [ et ]
Les caractères [ et ] servent à désigner un caractère quelconque parmi un ensemble spécifié sous forme d’énumération ou sous forme de plage contiguë, ou encore sous toute combinaison de ces deux possibilités.
4. Utilisation du caractère *
Le caractère * dans une expression est un facteur de répétition...
Exercices
1. Exercice 1
Que font les commandes suivantes ?
echo victoria | sed sectorielle
et :
echo mine | sed semeuse
Solution
Exécutons la première commande :
$ echo victoria | sed sectorielle
villa
puis la deuxième :
$ echo mine | sed semeuse
usine
Comment expliquer ces résultats ? Tout simplement en se souvenant que le premier argument passé à la commande sed décrit les commandes que sed doit exécuter :
dans les deux cas, la chaîne commence par la lettre s (sectorielle, semeuse) qui demande d’effectuer une substitution de chaîne de caractères.
En se souvenant ensuite également que le caractère qui suit la commande s est considéré comme un séparateur. On peut donc écrire la commande différemment, en utilisant par exemple un / pour séparer les chaînes. Les commandes deviennent alors :
$ echo victoria | sed s/ctori/ll/
villa
qui demande à sed de remplacer la chaîne ctori par la chaîne ll, et :
$ echo mine | sed s/m/us/
usine
qui demande à sed de remplacer la chaîne m par la chaîne us.
D’où les résultats affichés par la commande.
Cet exercice a uniquement pour but de mieux faire mémoriser au lecteur que la commande s de sed accepte d’autres séparateurs que le slash (/) habituel. Il est déconseillé d’utiliser des syntaxes obscures comme celles-là dans des scripts pouvant être maintenus par d’autres personnes.
Cette possibilité de remplacer le séparateur par un caractère quelconque fonctionne aussi avec ed, mais pas avec ex, qui n’a pas la même origine que sed et ed. ex accepte d’utiliser d’autres séparateurs que le /, mais refuse les lettres et les chiffres.
2. Exercice 2
Convertir un fichier dans lequel les champs de données sont séparés...