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 :
- Vous pouvez sélectionner le délimiteur de caractère des modèles. Le format général de l'expression est le suivant :
\?modèle?
où le point d'interrogation(?) est un délimiteur de caractère sélectionnable. Vous pouvez sélectionner tout caractère de l'environnement local en cours, excepté l'espace ou le caractère d'avance ligne. La barre oblique inversée (\)
n'est requise que pour la première occurrence du point d'interrogation (?).
Le format par défaut du modèle est le suivant :
/modèle/
Il n'est pas nécessaire d'utiliser une barre oblique inversée (\).
- La séquence \n représente un caractère d'avance ligne dans l'espace de modèle, sauf le caractère d'avance ligne de fin de ligne.
- Un point (.) représente tout caractère, sauf le caractère d'avance ligne de fin de ligne. Autrement dit, contrairement à la commande ed,
qui ne peut pas gérer un caractère d'avance ligne en milieu de ligne, la commande sed peut gérer ce caractère dans l'espace de modèle.
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 :
- Une ligne de commande sans adresse sélectionne chaque ligne.
- Une ligne de commande comportant une adresse, exprimée sous forme de contexte, sélectionne chaque ligne correspondant à l'adresse.
- Une ligne de commande comportant deux adresses séparées par des virgules sélectionne la plage définie par la première ligne qui correspond à la première adresse et la ligne suivante qui correspond à la seconde adresse. Si la seconde adresse est un numéro inférieur ou égal au premier numéro de ligne indiqué, une ligne unique est sélectionnée. Le processus est ensuite répété, autrement dit, la première adresse est recherchée à nouveau.
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 :
- 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.
- 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
- 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.
- 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é.
- 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.
- 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.
- 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.
- 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
- 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
où 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.