-  Sed est l’abréviation de Stream Editor, que l’on peut comprendre comme « éditeur de texte orienté flux ». Pour saisir ce que cela signifie, il faut d’abord revenir à l’un des premiers outils du système Unix : l’éditeur ed , d’ailleurs toujours disponible sur les systèmes Unix actuels.
-  On peut légitimement s’interroger sur la pertinence qu’il y a à utiliser sed, ainsi que d’autres outils comme Awk, pour manipuler de nos jours des fichiers de texte ASCII brut.
-  Dans le monde professionnel, la rédaction d’un document passe systématiquement par un traitement de texte WYSIWIG (What You See Is What You Get).
-  Quoi qu’il en soit, les choses continuent à évoluer, et un nouveau besoin se fait de plus en plus pressant, surtout dans les environnements techniques : disposer simultanément de deux versions de la même documentation.
-  → sed et Awk sont des outils absolument indispensables pour l’administrateur système qui doit exploiter des fichiers de trace (log files), ou manipuler automatiquement des fichiers de configuration sur une machine ou un parc complet.
-  Le programme sed va agir sur les lignes d’un fichier de texte ou de son entrée standard, et fournir les résultats sur sa sortie standard.
-  La syntaxe d’invocation est la suivante :
-  Si aucun fichier à traiter n’est indiqué, sed attend les données sur son entrée standard. Lorsqu’on fournit directement les commandes sur la ligne, grâce à l’option -e , il est préférable de les inclure entre apostrophes simples, en raison de l’usage fréquent des caractères $ , * , ? , etc., susceptibles d’être interprétés par le shell.
-  Une option importante est également disponible : -n , avec laquelle sed fonctionne en mode silencieux, c’est-à -dire qu’il ne copie une ligne de texte de l’entrée standard vers la sortie standard que si on le lui demande explicitement, et non pas automatiquement comme c’est le cas par défaut.
-  Cette capacité à traiter les informations « au vol » dans les flux d’entrée-sortie standards fait que l’on utilise fréquemment sed au sein de pipelines regroupant d’autres commandes système.
-  Ce traitement immédiat du texte lu dicte le fonctionnement même de sed , puisqu’il ne dispose pas d’une vue globale sur le fichier à traiter, mais uniquement des informations fractionnaires, délivrées sur le flux d’entrée standard.
-  Ainsi sed repose-t-il sur le mécanisme suivant :
-  Les commandes que sed accepte ne sont pas très nombreuses, et sont toujours représentées par une lettre unique ( a , b , c , d , g , h , i , n , p , q , r , s , t , y ) ou par le signe = .
-  En pratique, seules trois commandes sont utilisées réellement ( d , p , et s ), les autres donnant des lignes illisibles et surtout impossibles à maintenir.
-  Une commande peut être éventuellement précédée d’une adresse.
-  Les numéros de ligne commencent à 1 et se poursuivent sans interruption sur l’ensemble des fichiers à traiter.
-  Une expression rationnelle permet de sélectionner une ou plusieurs lignes en fonction de leur contenu.
-  Tout d’abord, nous allons demander à sed d’appliquer la commande p (print) aux lignes du fichier, sans aucun filtrage.
-  Cette commande demande l’affichage explicite de la ligne en cours. Comme l’option -n n’est pas employée, sed effectue aussi une copie systématique des données lues vers la sortie standard, ce qui a pour effet de dupliquer les lignes
-  Nous pouvons examiner le filtrage des lignes, en demandant une sélection du numéro de ligne : $sed -n -e ‘NuméroLignep’ Fichier
-  Exemple : $sed -n -e ‘2p’ /etc/hosts.allow
-  On peut aussi sélectionner une ligne en indiquant un motif (sous forme d’expression régulière) qu’elle doit contenir. Ce motif est indiqué entre caractères slashes / (barres obliques)
-  $sed -n -e ‘/regexp/p’ Fichier
-  La commande p , accepte une sélection de lignes sous forme d’intervalle. Un intervalle est décrit par deux adresses séparées par une virgule.
-  Un intervalle peut aussi être décrit par deux expressions régulières par une virgule.
-  sed affichera le texte de la première ligne contenant regexp1 vers la dernière ligne contenant regexp2
-  L’adresse symbolique $ correspond à la dernière ligne du dernier fichier à traiter.
-  On notera également que l’on peut nier une adresse, c’est-à -dire n’exécuter la commande que sur les lignes qui ne correspondent pas à la sélection grâce à l’opérateur ! .
-  Par exemple, nous n’affichons ici que les lignes qui ne sont pas vides :
- Â On peut utiliser la commande p vue ci-dessus surtout pour deux raisons principales :
Suppression de ligne
-  La commande d (delete) permet de supprimer la ligne sélectionnée. Naturellement, comme sed travaille sur un flux de données et pas directement sur un fichier, il ne s’agit pas d’une véritable suppression, mais plutôt d’un abandon.
-  En rencontrant cette commande, sed passe simplement à la ligne suivante sans afficher celle en cours.
-  On utilise la commande d de manière symétrique à la commande p , lorsqu’on sait sélectionner ce que l’on veut rejeter, pour garder tout le reste
-  Nous pouvons également supprimer toutes les lignes sauf celles qui contiennent un motif (« that » par exemple) :
-  Bien que l’on puisse placer plusieurs commandes successives en argument de l’option -e , en les séparant à l’aide d’un point-virgule, on conseille de les éclater en plusieurs invocations de sed enchaînées par des pipes | au niveau du shell.
-  L’exécution sera un peu moins efficace – car on aura un plus grand nombre de processus – mais on gagnera en lisibilité si les tâches successives sont clairement distinguées.
-  Par exemple, si l’on désire supprimer toutes les lignes blanches, ou celles qui débutent
par un caractère dièse ( # ) on peut écrire :
– $sed –e ‘/^[[:blank:]]*$/d;
/^[[:blank:]]*#/d’
– $sed –e ‘/^ [[:blank:]]*$/d’ |
sed –e ‘/^[[:blank:]]*#/d’