Commande sed

Fonction

Editeur par flot de données.

Syntaxe

sed-n ] Script Fichier ... ]

sed-n ] [  -e Script ] ... [  -f FichierScript ] ... Fichier ... ]

Description

La commande sed modifie des lignes du paramètre Fichier spécifié, conformément à un script d'édition, puis écrit ces lignes sur la sortie standard. Elle propose de nombreuses fonctions qui permettent de sélectionner les lignes à modifier et d'intervenir uniquement sur elles.

La commande sed utilise deux espaces de travail pour stocker la ligne en cours de modification : l'espace de modèle, qui héberge la ligne sélectionnée, et l'espace de stockage dans lequel une ligne peut être placée temporairement.

Un script d'édition se compose de sous-commandes individuelles, chacune se trouvant sur une ligne distincte. Le format général des sous-commandes sed est le suivant :

[plage-adresses] fonction[modificateurs]

La commande sed traite chaque paramètre Fichier en entrée comme suit : elle lit une ligne d'entrée dans un espace de modèle, applique dans l'ordre toutes les sous-commandes sed dont les adresses sélectionnent cette ligne et écrit le contenu de l'espace de modèle sur la sortie standard. Elle efface ensuite l'espace de modèle et répète ce processus pour chaque ligne spécifiée dans le paramètre Fichier en entrée. Certaines des sous-commandes sed proposent un espace de stockage dans lequel l'espace de modèle est sauvegardé, en tout ou en partie, pour une utilisation ultérieure.

Lorsqu'une commande comprend une adresse (numéro de ligne ou modèle de recherche), seules la ou les lignes concernées sont affectées. Sinon, la commande est appliquée à la totalité des lignes.

Une adresse peut être un numéro de ligne décimal, le symbole dollar ($), qui représente la dernière ligne en entrée, ou une adresse de contexte. Une adresse de contexte est une expression régulière similaire à celles utilisées dans la commande ed, à quelques différences près :

Certaines commandes, dites commandes adressées vous permettent de spécifier la ligne ou la plage de lignes à laquelle elles doivent être appliquées. Ces commandes sont soumises aux règles suivantes :

Options

-e Script Utilise la variable Script en tant que script d'édition. Si vous utilisez une seule option -e et aucune option -f, vous pouvez omettre l'option -e.
-f FichierScript Utilise la variable FichierScript comme script d'édition source. Cette variable représente un ensemble préparé de commandes d'édition appliqué au paramètre Fichier.
-n Supprime toutes les informations qui sont normalement écrites sur la sortie standard.
Remarque :
Vous pouvez spécifier plusieurs options -e et -f. Toutes les sous-commandes sont ajoutées au script dans l'ordre indiqué, quelle que soit leur origine.

Sous-commandes sed

La commande sed contient les sous-commandes de script sed suivantes. Le nombre entre parenthèses qui précède une sous-commande indique le nombre maximal d'adresses géré par la sous-commande.

Remarques :
  1. La variable Texte qui accompagne les sous-commandes a\, c\ et i\ peut s'étendre sur plusieurs lignes, à condition que toutes les lignes, excepté la dernière, se terminent par une barre oblique inversée (\) pour représenter le caractère d'avance ligne. Les barres obliques inversées qui figurent dans le texte sont traitées en tant que telles dans la chaîne de substitution d'une commande s. Elles permettent de protéger les blancs initiaux et les tabulations pour éviter qu'ils ne soient pas supprimés comme ils le seraient autrement dans chaque ligne de script. Les variables FichierL et FichierE doivent être placées à la fin de la ligne de commande et être précédées d'un blanc. Les variables FichierE sont créées avant le début du traitement.
  2. La commande sed peut traiter 999 sous-commandes au maximum dans un fichier de modèle.
Sous-commande Description
(1) a\  
Texte Place la variable Texte en sortie avant de lire la ligne en entrée suivante.
(2)b[label] S'oriente vers la commande : comportant la variable label. Si la variable label est vide, la sous-commande s'oriente vers la fin du script.
(2)c\  
Texte Supprime l'espace de modèle. Avec 0 ou 1 adresse ou à la fin d'une plage de 2 adresses, la sous-commande place la variable Texte en sortie et commence le cycle suivant.
(2)d Supprime l'espace de modèle et commence le cycle suivant.
(2)D Supprime le segment initial de l'espace de modèle jusqu'au premier caractère d'avance ligne, puis commence le cycle suivant.
(2)g Remplace le contenu de l'espace de modèle par le contenu de l'espace de stockage.
(2)G Ajoute le contenu de l'espace de stockage à la fin de l'espace de modèle.
(2)h Remplace le contenu de l'espace de stockage par le contenu de l'espace de modèle.
(2)H Ajoute le contenu de l'espace de modèle à la fin de l'espace de stockage.
(1)i\  
Texte Ecrit la variable Texte sur la sortie standard avant de lire la ligne suivante dans l'espace de modèle.
(2)l Ecrit l'espace de modèle sur la sortie standard en affichant les caractères non affichables sous la forme de valeurs hexadécimales à 4 chiffres. Les lignes longues sont réparties sur plusieurs lignes.
(2)l Ecrit l'espace de modèle sur la sortie standard dans un format clairement lisible. Les caractères \\\, \\a, \\b, \\f, \\r, \\t et \\v sont représentés par la séquence d'échappement correspondante. Les caractères non imprimables se présentent sous la forme d'un nombre octal à trois chiffres (avec une barre oblique inversée en préfixe) pour chaque octet (le plus important en premier). Ce format est également appliqué aux caractères multi-octet. Cette sous-commande affiche les lignes longues sur plusieurs lignes. Une barre oblique inversée suivie d'un caractère d'avance ligne indique le point de retour à la ligne. Le retour à la ligne se produit à la 72e colonne. Le symbole dollar ($) marque la fin de chaque ligne.
(2)n Ecrit l'espace de modèle sur la sortie standard si la sortie standard par défaut n'est pas supprimée. Cette sous-commande remplace l'espace de modèle par la ligne en entrée suivante.
(2)N Ajoute la ligne en entrée suivante à la fin de l'espace de modèle avec un caractère d'avance ligne incorporé (le numéro de la ligne en cours change). Vous pouvez utiliser cette sous-commande pour rechercher des modèles qui sont répartis sur deux lignes.
(2)p Ecrit l'espace de modèle sur la sortie standard.
(2)P Ecrit le segment initial de l'espace de modèle jusqu'au premier caractère d'avance ligne sur la sortie standard.
(1)q Atteint la fin du script, sans commencer un nouveau cycle.
(2)r FichierL Lit le contenu de la variable FichierL et le place en sortie avant de lire la ligne en entrée suivant.
(2)s/modèle/remplacement/options Substitue la chaîne remplacement à la première occurrence du paramètre modèle dans l'espace de modèle. Tout caractère affiché après la sous-commande s peut remplacer le séparateur / (barre oblique), sauf l'espace ou le caractère d'avance ligne.

La valeur de la variable Options doit être aucun ou un ou plusieurs des éléments suivants :

g
Remplace toutes les occurrences qui ne se chevauchent pas du paramètre modèle, pas seulement la première.
n
Remplace la nème occurrence seulement du paramètre modèle.
p
Ecrit l'espace de modèle sur la sortie standard si un remplacement a été effectué.
w FichierE
Ecrit l'espace de modèle dans la variable FichierE si un remplacement a été effectué. Ajoute l'espace de modèle à la fin de la variable FichierE. Si la variable FichierE n'a pas été créée au préalable par une opération d'écriture du script sed en cours, elle est créée par la commande sed.
(2)tlabel Effectue un branchement vers la variable :label dans le fichier de script si des remplacements ont été effectués depuis la dernière exécution d'une sous-commande t en ligne d'entrée. Si vous ne spécifiez pas la variable label, cette sous-commande passe à la fin du script.
(2)wFichierE Ajoute l'espace de modèle à la fin de la variable FichierE.
(2)x Remplace le contenu de l'espace de modèle par celui de l'espace de stockage, et inversement.
(2)y/modèle1/modèle2/ Remplace toutes les occurrences des caractères de la variable modèle1 par les caractères correspondants de la variable modèle2. Les variables modèle1 et modèle2 doivent contenir le même nombre de caractères. Le caractère d'avance ligne est représenté par \n.
(2)!Commande-sed Applique la sous-commande spécifiée sed uniquement aux lignes non sélectionnées par la ou les adresses.
(0):label Marque un point de branchement à référencer par les sous-commandes b et t. Ce label peut être toute séquence de huit octets au maximum.
(1)= Ecrit le numéro de ligne en cours sur la sortie standard en tant que ligne.
(2){sous-commande } Regroupe les sous-commandes entre accolades ({}).
(0) Ne tient pas compte d'une commande vide.
(0)# Toute ligne d'un fichier de script qui commence par un signe dièse (#) est considérée comme un commentaire, à une exception près. Si, sur la première ligne uniquement d'un fichier de script, le dièse est suivi d'un n, la sortie par défaut est supprimée. Les caractères suivant #n ne sont pas pris en compte.

Etat de sortie

Cette commande renvoie les valeurs de sortie suivantes :

0 Exécution réussie.
>0 Une erreur s'est produite.

Exemples

  1. Pour effectuer une modification globale, entrez :

    sed  "s/heureux/enchanté/g" chap1

    Cette commande remplace chaque occurrence du mot heureux, dans le fichier chap1, par le mot enchanté. Le caractère g qui figure à la fin de la sous-commande s ordonne à la commande sed d'effectuer autant de remplacements que possible sur chaque ligne. En l'absence du caractère g, la commande sed remplace uniquement la première occurrence du mot heureux sur une ligne.

    La commande sed fonctionne comme un filtre. Elle lit le texte en entrée standard ou dans les fichiers spécifiés sur la ligne de commande (chap1 dans cet exemple), modifie ce texte, puis l'écrit sur la sortie standard. Contrairement à la plupart des éditeurs, elle ne remplace pas le fichier d'origine. C'est ce qui en fait une commande puissante lorsqu'elle est utilisée dans les pipelines.

  2. Pour utiliser la commande sed comme filtre dans un pipeline, entrez :

    pr  chap2 | sed "s/Page *[0-9]*$/(&)/" | enq

    Cette séquence de commandes met les numéros de page entre parenthèses avant d'imprimer le fichier chap2. La commande pr insère un en-tête et un numéro de page en haut de chaque page, la commande sed place ensuite les numéros de page entre parenthèses et, pour finir, la commande enq imprime le listage modifié.

    Le modèle /Page *[0-9]*$/ de la commande sed recherche les numéros de page qui figurent en fin de ligne. La sous-commande s remplace ce modèle par (&), & correspondant au numéro de page trouvé.

  3. Pour afficher des lignes déterminées d'un fichier, entrez :

    sed  -n  "/aliment/p" chap3

    sed -n affiche chaque ligne du fichier chap3 qui contient le mot aliment. Par défaut, la commande sed copie chaque ligne vers la sortie standard une fois qu'elle est éditée, mais l'option -n l'en empêche. Vous pouvez ensuite utiliser des sous-commandes telles que p pour écrire des parties spécifiques du texte. En l'absence de l'option -n, cet exemple affiche toutes les lignes du fichier chap3 et affiche chaque ligne contenant le mot aliment deux fois.

  4. Pour effectuer des modifications complexes, entrez :

    sed  -f  script.sed  chap4

    Cette séquence de commandes crée un fichier de script sed que vous pouvez utiliser pour effectuer des modifications complexes. Vous pouvez en effet tester et modifier votre script avant de l'utiliser. Vous pouvez également le réutiliser pour modifier d'autres fichiers. Créez le fichier de script dans un éditeur de texte interactif.

  5. Exemple de fichier de script sed :

    :join
    /\\$/{N
    s/\\\n//
    b join
    }

    Ce script sed relie chaque ligne qui se termine par une barre oblique inversée (\) à la ligne suivante. En premier lieu, le modèle  /\\$/  sélectionne une ligne qui se termine par une barre oblique inversée (\) pour le groupe de commandes figurant entre accolades ({}). La sous-commande N ajoute ensuite la ligne suivante, en incorporant le caractère d'avance ligne. La séquence s/\\\n// supprime la barre oblique inversée (\) et le caractère d'avance ligne incorporé. Enfin, b join revient au label :join pour rechercher une nouvelle barre oblique inversée () à la fin de la nouvelle ligne liée. Sans le branchement, la commande sed lirait la ligne liée, puis la suivante, avant de rechercher une seconde barre oblique inversée ( \).

    Remarque :
    La sous-commande N entraîne l'arrêt immédiat de la commande sed lorsqu'il n'y a plus de lignes en entrée (autrement dit, si la sous-commande N lit un caractère de fin de fichier). Elle ne copie pas l'espace de modèle sur la sortie standard avant de s'arrêter. Par conséquent, si la dernière ligne en entrée se termine par une barre oblique inversée (\), elle n'est pas copiée sur la sortie standard.
  6. Pour copier un fichier existant (ancienfichier) dans un nouveau fichier (nouveaufichier) et remplacer toutes les occurrences de la chaîne de texte modèletest par le contenu de la variable du shell $REPL, entrez :

    cat ancienfichier | sed -e "s/modèletest/$REPL/g" | tee nouveaufichier
  7. Pour remplacer toutes les occurrences de A par a, B par b, C par c, et toutes les occurrences des caractères d'avance ligne par le caractère Z dans le fichier en entrée, entrez :
    $ sed -f fichier.commande fichier.entrée
    fichier.commande représente le fichier de script et fichier.entrée, le fichier en entrée.
       $cat fichier.commande
       y/ABC\n/abcZ/
    
    Pour effectuer cette opération, vous pouvez aussi exécuter la commande suivante :
    sed "y/ABC\n/abcZ/" fichier.entrée

Rubriques connexes

Commandes awk et grep.


Envoyer un commentaire | Evaluer la page