L'utilitaire sed

Introduction

Le programme sed est un éditeur de texte en ligne. Contrairement aux autres éditeurs de texte comme ed, ex ou vi qui agissent sur un fichier en le modifiant directement, sed agit sur un fichier d'entrée pour produire une version modifiée dans un fichier de sortie distinct, le fichier d'entrée n'étant jamais modifié. Cette caractéristique est très utile dans les pipes et dans les scripts shells.

La syntaxe est peu conviviale mais elle permet de réaliser des traitements complexes sur des fichiers.

Utilisation du programme sed

Syntaxe du programme sed

La syntaxe de sed est la suivante :

sed -e "programme sed" fichier-a-traiter

ou

sed -f fichier_programme fichier_a_traiter

L'option -n supprime la sortie standard par défaut, sed écrit uniquement les lignes concernées par le traitement sed (dans le cas contraire sed renvoie en sortie toutes les lignes même celles qui n'ont pas subi de traitement par le programme sed).

L'option -e est optionnelle lorsqu'il n'existe qu'une seule fonction d'édition.

Pour plus d'informations sur le programme sed, consulter le man du programme sed.

La commande de substitution s

La commande de substitution s permet de changer la première ou toutes les occurrences d'une chaine de caractères par une autre. Les changements sont réalisés dans la sortie standard. Les paramètres de la commande de substitution s et ses paramètres doivent être placés entre simple quotes pour les protéger du shell.

La commande s peut accomoder des expressions régulières. Sans l'option g, le remplacement ne se fait qu'une fois par ligne.

Substitution de la première occurrence chaine1 par CHAINE1 :

sed "s/chaine1/CHAINE1/" fichier

Substitution de la troisième occurrence chaine1 par CHAINE1 :

sed "s/chaine1/CHAINE1/3" fichier

Substitution de toutes les occurrences chaine1 par CHAINE1 :

sed "s/chaine1/CHAINE1/g" fichier

En cas de substitution, la ligne concernée est affichée

sed "s/chaine1/CHAINE1/p" fichier

En cas de substitution, la ligne est écrite dans le fichier resultat :

sed "s/chaine1/CHAINE1/w resultat" fichier

Subsitution de toutes les occurrences Chaine1 ou chaine1 par CHAINE1 :

sed "s/[Cc]aine1/CHAINE1/g" fichier

Substitution de chaine1 par chaine2 à condition que chaine1 se présente en début de ligne :

sed "s/^chaine1/chaine2/g" fichier

Pour délimiter les chaines de caractère source et objet, le caractère '/' a été utilisé, mais il est possible d'utiliser un autre caractère surtout si le caractère '/' doit être traité par sed :

Exemple :

sed -n "s+chaine1+chaine2/g" fichier

La commande de substitution y

La commande y de subsitution effectue le remplacement de caractères dans la première chaine par le caractère dans la seconde chaine à la même position.

Exemple :

sed "y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwsyz/g"

La commande de suppression d

La fonction de suppression d supprime des lignes comprises dans un intervalle donné.

Exemple :

sed "20,30d" fichier  (pour supprimer les lignes 20 à 30 dans le fichier)

Les expressions régulières sont autorisées.

Exemples : 

sed "/chaine1/d" fichier
sed "/chaine1/ !d" fichier

Le premier exemple supprime toutes les lignes contenant la chaine chaine1. Dans le second cas, seules les lignes ne contenant pas la chaine chaine1 sont supprimées.

Pour rappel, ces lignes ne sont pas supprimées dans le fichier, elles le sont uniquement dans la sortie standard.

Les commandes p, l et =

  • La commande p (print) affiche la ligne sélectionnée sur la sortie standard. Elle invalide l'option n
  • La commande l (list) affiche la ligne sélectionnée sur la sortie standard avec en plus les caractères de contrôle en clair avec leur code ASCII (deux chiffres en octal)
  • La commande = donne le numéro de la ligne sélectionnée sur la sortie standard

Ces trois commandes sont très utiles lors des opérations de débug avec les programmes sed.

Exemple :

sed "/chaine1/=" fichier 

Les commandes q, r et w

  • La commande q (quit) interrompt le programme sed, la ligne en cours de traitement est affichée sur la sortie standard (sauf si l'option n est activée).
  • La commande r (read) lit le contenu d'un fichier et écrit le contenu dans la sortie standard.
  • La commande w (write) écrit la ligne sélectionnée dans un fichier.

Exemple :

sed "/^chaine1/w resultat" fichier 

Dans l'exemple ci-dessus, toutes les lignes dans le fichier contenant la chaine de caractères chaine1 sont écrites dans le fichier resultat.

Les commandes a et i

  • La commande a (append) ajoute un texte après la ligne sélectionnée
  • La commande i (insert) insère un texte avant la ligne sélectionnée

La caractère \ permet d'effectuer des retours chariot si le texte à insérer ou à ajouter se présente sur plusieurs lignes.

Exemples : fichier prog.sed

1i\   
Début du traitement du fichier 
s/[cC]haine1/CHAINE1/g  
$a  \     Fin du traitement\    
du fichier  

sed -f prog.sed  <fichier> 
  • Dans ce programme une ligne est insérée avant la ligne 1 : Début du traitement du fichier
  • Toutes les occurrences chaine1 ou Chaine1 sont remplacées par CHAINE1
  • Insertion après la dernière ligne des lignes : 
Fin du traitement du fichier