Commande Sed : Unix
Présentation de SED
- 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.
- Il s’agit d’un éditeur de texte, comme vi , emacs , nedit , etc. ; toutefois, contrairement à ces derniers, il ne fonctionne pas sur une page complète de texte affichée à l’écran, mais sur une seule ligne à la fois.
- 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.
- Après tout, il s’agit d’instruments conçus pour l’informatique des années 1970 ; leur emploi se justifie-t-il encore à l’ère du son et des images numériques ?
- Naturellement cela dépend de l’usage que l’on fait de ces fichiers et de la nécessité – ou non – de répéter ultérieurement les mêmes traitements sur différents fichiers.
- 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).
- Certaines personnes le regrettent et préfèrent employer des logiciels de traitement de documents comme TeX, LaTeX, mais force est de constater que l’usage courant a standardisé certaines applications comme Word.
- 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.
- La version imprimée, soigneusement mise en page et correctement reliée, est préférable pour une consultation prolongée, confortable,
- tandis que la version électronique en ligne est indispensable pour une recherche rapide ou une consultation à distance.
- De nouveaux formats émergent (XML, etc.) qui permettent une conversion plus ou moins aisée vers le support employé pour la consultation. On peut raisonnablement imaginer qu’une part non négligeable des documents techniques à venir seront disponibles dans ces formats.
- → 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.
Principe de SED
- 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.
- En conséquence, les instructions de manipulation doivent être fournies dans des fichiers de scripts indépendants, ou en ligne de commande.
- La syntaxe d’invocation est la suivante :
- sed -e 'instructions' fichier_à_traiter
- sed -f script fichier_à_traiter
- 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 :
- Lecture d’une ligne sur le flux d’entrée (jusqu’à ce qu’il rencontre un caractère de saut de ligne) ;
- Traitement de cette ligne en la soumettant à toutes les commandes rencontrées dans le fichier script ;
- Affichage de la ligne résultante sur la sortie standard, sauf si sed est invoqué avec l’option – n ;
- Passage à la ligne suivante, et ainsi de suite jusqu’à la fin du flux d’entrée standard.
Fonctionnement de SED
- 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 = .
- Il s’agit essentiellement d’insertion ou de suppression de lignes, et de modification de chaînes de caractères.
- 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.
- Dans ce cas, elle ne s’applique qu’aux lignes concernées du flux d’entrée standard. Une adresse se présente sous forme numérique – correspondant alors au numéro de la ligne sélectionnée – ou sous forme d’expression régulière.
- 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.
- $sed -n -e ‘num1,num2p’ Fichier
- Un intervalle peut aussi être décrit par deux expressions régulières par une virgule.
- $sed -n -e ‘/regexp1/,/regexp2/p’ Fichier
- 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 :
Commandes SED
- On peut utiliser la commande p vue ci-dessus surtout pour deux raisons principales :
- Afficher la n-ième ligne ( sed –ne ‘Np’ ), ou les lignes de la n-ième à la m-ième d’un fichier ( sed –ne ‘N,Mp’ ). Ceci est également possible en enchaînant les commandes tail et head mais de manière moins élégant
- Afficher les lignes dans un intervalle délimité par des expressions régulières. C’est en quelque sorte une extension de la commande grep qui n’affiche que les lignes correspondant à une expression, mais pas un intervalle.
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
- sed –ne ‘/selection_a_conserver/p’
- est symétrique à :
- sed –e ‘/selection_a_rejeter/d’
- 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’