Vous êtes sur la page 1sur 21

Commande sed : utilisation et

exemples
16 août 2021 GNU/LinuxDernière modification : 16 août 2021

sed (stream editor) est une commande linux puissante pour effectuer des
opérations de texte.
Il peut effectuer une manipulation de texte de base sur des fichiers et des
flux dʼentrée tels que des pipes. Avec SED, vous pouvez rechercher,
trouver et remplacer, insérer et supprimer des mots et des lignes. Il prend
en charge des expressions régulières de base et étendues qui vous
permettent de faire correspondre des modèles complexes.

Malheureusement, ce nʼest pas une commande simple à prendre en main.


Mais grâce à ce tutoriel complet, vous trouverez tous les exemples
dʼutilisations de la commande sed avec des explications claires.
De quoi, bien comprendre le fonctionnement de sed.

Que fait la commande sed ?


SED est un éditeur de flux qui fonctionne sur une entrée de commandes
ou des fichiers de texte.
Il nʼa toutefois pas une interface dʼéditeur de texte interactive.
Au lieu de cela, vous fournissez des instructions à suivre comme cela
fonctionne dans le texte. Tout cela fonctionne dans Bash et dʼautres Shell
de ligne de commande.

Avec sed, vous pouvez effectuer les opérations de texte suivantes :

Sélectionnez le texte (Chercher)


Substituer du texte (Chercher/Remplacer)
Ajouter des lignes au texte
Supprimer des lignes du texte Modifier (ou conserver) un fichier
original

La recherche de motif peut se faire sur un caractère, suite de caractères


mais aussi par des expressions régulières.

Commande sed : utilisation et exemples


Imaginons le texte suivant dans le fichier rose-tatoo.txt :

1 The pictures tell the story


2 This life had many shades
3 I'd wake up every morning and before I'd start each day
4 I'd take a drag from last nights cigarette
5 That smoldered in its tray
6 Down a little something and then be on my way
7
8 I traveled far and wide
9 And laid this head in many ports
10 I was guided by a compass
11 I saw beauty to the north
12 I drew the tales of many lives
13 And wore the faces of my own
14 I had these memories all around me
15 So I wouldn't be alone
Sélectionner des lignes dʼun fichier texte

Pour sélectionner du texte, on utilise le flag p (print).

Voici un exemple dʼutilisation de sed pour sélectionner de la ligne 1 à la


ligne 4 :

sed -n '1,4p' rose-tatoo.txt

Si lʼon désire sélectionner des portions spécifiques de texte avec


différentes intervalles de lignes, on peut utiliser lʼoption -e.
Cela permet de combiner plusieurs sélections de texte.
Par exemple pour afficher les lignes de 1 à 4 et de 5 à 10 dʼun fichier :

sed -n -e '1,4p' -e '5,10p' rose-tatoo.txt


Le premier numéro indique la ligne de départ.
Le deuxième numéro dit SED Quelles lignes après la ligne de départ que
nous voulons voir.
Le numéro 2 signifie chaque deuxième ligne, 3 signifie chaque troisième
ligne, etc.

sed -n '1~2p' rose-tatoo.txt

Nous pouvons également choisir une ligne de départ et dire à sed de


passer à travers le fichier et dʼimprimer des lignes alternées pour ignorer
un nombre de lignes.
La commande est similaire à celle que nous avons utilisée ci-dessus pour
sélectionner une plage. Cette fois, cependant, nous utiliserons un tilde (~)
au lieu dʼune virgule pour séparer les chiffres.

Par exemple pour afficher toutes les deux 2 lignes dʼun fichier à partir de
la ligne 1 :

sed -n '1~2p' rose-tatoo.txt

Pour afficher toutes les 3 lignes à partir de la ligne 1 :

sed -n '1~3p' rose-tatoo.txt


Encadrer un texte entre deux motifs

Pour supprimer toutes les lignes dʼun texte entre deux motifs, on
utilise le flag d (delete) avec la syntaxe suivante :

sed '/motif1/,/motif2/d' [fichier]

Par exemple pour supprimer les lignes entre les lignes avec I Traveled
(ligne 8) et I had (ligne 14), on utilise sed comme ceci :

sed '/I traveled/,/I had/d' rose-tatoo.txt

Ainsi, on passe de la ligne 7 à la ligne 15.

Chercher motif dans texte

sed est un outil très utile pour rechercher des motifs dans un texte.
Il est tout aussi puissant que la commande grep.
La syntaxe à utiliser est la suivante :

sed -n '/motif/p' [fichier]

Par exemple pour chercher toutes les lignes commençant par une
tabulation puis suivi des chiffres de 10 à 19.
Ce qui dans notre cas fait ressortir les lignes de 10 à 19.
Ici on utilise des expressions régulières :

Le caractère ^ indique de capturer le début de la ligne


Puis \t indique que lʼon cherche une tabulation
Enfin [1-9][0-9] demande capturer les caractère de 10 à 19. On aurait
aussi pu écrire [0-9]{2}

sed -n "/^\t[1-9][0-9]/p" rose-tatoo.txt

Bien sûr, en reprenant les explications précédentes, il est plus rapide


dʼafficher par numéro de lignes :

sed -n '10,19p' rose-tatoo.txt

Pour afficher les lignes contenant lʼexpression Iʼd.


Ici on entoure la commande sed par des apostrophes car Iʼd contient le
caractère ‘.
Cela évite de lʼéchapper.
sed -n "/I'd/p" rose-tatoo.txt

Remplacer chaines de caractères, texte (Subtitution)

Maintenant que lʼon sait chercher du texte, on peut le remplacer.


En effet, sed est capable de substituer du texte provenant dʼune
commande ou sur un fichier (plus bas).
Voici la syntaxe pour effectuer du chercher et remplacer dans une chaines
de caractères, texte.

sed -n 's/motif_a_chercher/texte_remplacement/g' [texte]

Le s dit à SED Ceci est une substitution.


La première chaîne est le modèle de recherche
La seconde est le texte avec lequel nous souhaitons remplacer ce
texte correspondant

Par exemple ici, on remplace le mot Ubuntu par Debian :

echo "J'aime Ubuntu"| sed 's/Ubuntu/Debian/g'

Comme toute commande Linux, sed est sensible à la casse.


Ainsi, si on demande de remplacer le mot ubuntu, cela ne fonctionnera
pas.
Pour rendre sed insensible à la casse, on ajoute i à la fin :

echo "J'aime Ubuntu"| sed 's/ubuntu/Debian/gi'


La syntaxe pour rechercher et remplacer un texte dans un fichier est la
même.
Par exemple pour remplacer toutes les occurrences “I ” ou “Iʼd” par “We” :

sed "s/I/We/g" rose-tatoo.txt

Bien sûr, on peut rediriger la sortie de la console vers un autre fichier


grâce à > :

sed -r "s/I/We/g" rose-tatoo.txt > rose-tatoo-new.txt

Le flag g pour global indique de remplacer toutes les occurrences du


fichier.
Si on ne spécifie pas /g, sed remplace la première occurrence de la ligne
mais pas les suivantes.
Ainsi, dans cette phrase, I nʼest remplace quʼune seule fois :

We'd wake up every morning and before I'd start each day
On peut aussi indiquer quelle occurrence dʼune ligne remplacer à travers
son numéro.
Par exemple pour remplacer la première occurrence utilisez /1, pour
remplacer la seconde occurrence utilisez /2, etc.

sed "s/I/We/2" rose-tatoo.txt


Pour limiter le chercher remplace à une ligne en particulier, par exemple la
seconde ligne :

sed '2 s/lorem/Lorem/' content.txt

Pour que la substitution se fasse sur toute la ligne, ajoutez /g :

sed "3 s/I/We/g" rose-tatoo.txt

Dernier exemple, où lʼon supprime les numéros de lignes entre les deux
tabulations de notre fichier.
Toutefois à la fin de ce didacticiel, vous verrez que lʼon peut aussi
supprimer des lignes de texte avec sed.

sed -r 's/^\t[0-9]{1,}\t//g' rose-tatoo.txt

Lʼoption -r demande à sed dʼutiliser les regex étendues.


Remplacer une chaîne de texte dans un fichier

Pour remplacer directement dans un fichier, on utilise la commande sed


exactement de la même manière.
Simplement pour rechercher et remplacer une chaîne de texte dans un
fichier, on ajoute lʼoption -i :

sed -i "s/I/We/g" rose-tatoo.txt

De ce fait sed nʼimprime rien sur la sortie du terminal.

Supprimer une chaîne de caractère

On peut aussi supprimer une occurrence en ne spécifiant aucun texte à


remplacer.
Par exemple pour supprimer morte de malekalmorte :

echo "www.malekalmorte.com"| sed 's/morte//g'


www.malekal.com

Remplacer plusieurs motifs à la fois en une seule


commande sed

On peut aussi utiliser lʼoption -e pour effectuer une succession de


rechercher/remplacer dʼun motif.
Cela permet de remplacer plusieurs motifs à la fois en une seule
commande sed.
Ainsi, pour remplacer deux chaînes de caractères avec la commande sed :

sed -e 's/I/We/' -e 's/my/our/g' rose-tatoo.txt

Voici une autre syntaxe possible pour remplacer plusieurs motifs à la


fois en une seule commande sed.
On encadre les scripts avec ‘ et on les sépare avec ; sauf pour le dernier.

sed 's/I/We/; s/my/our/g' rose-tatoo.txt


Ajouter du texte en début ou en fin de ligne

Pour ajouter du texte en début de ligne, on joue avec le caractère ^ qui


demande à sed de viser le début de la ligne :

sed -e 's/^/#/' fichier.txt


Pour ajouter du texte à la fin dʼune ligne, il faut cette fois-ci jouer avec le
caractère $.
Par exemple pour ajouter un point à la fin de ligne.
Ici nul besoin dʼéchapper le caractère . car nous nʼutilisations pas de regex
basiques ou étendues.

sed 's/$/./' rose-tatoo.txt


Ainsi pour ajouter un commentaire à la fin de chaque ligne :

sed 's/$/# Ceci est un commentaire/' config.conf

Le problème ici est que le commentaire sʼajoute aussi dans les lignes
vides.
Pour ajouter du texte au début dʼune ligne mais PAS dans les lignes vides.
!s signifie non ligne vide.

sed '/^$/!s/^/#/g' config.conf

Enfin pour ajouter du texte seulement dans les lignes vides :

sed 's/^$/Je rempli une ligne vide/' config.conf

Autre syntaxe possible pour viser les lignes vides avec le caractère s :

sed '/^$/s/^/#/g' config.conf

Insérer des lignes dans un texte

Pour insérer une chaîne avant chaque ligne :

sed 'i \# je suis un commentaire' config.conf


Pour insérer une ligne après chaque ligne :

sed 'a \# je suis un commentaire' config.conf

Il est tout à fait possible de combiner les deux drapeaux afin dʼinsérer du
texte avant et après :

sed 'ia \# je suis un commentaire' config.conf

Enfin pour ajouter un texte avant ou après un motif, la syntaxe est la


suivante :

sed -r '/\[\w+\]/a# je suis ligne insérée' config.conf


Ici nous chercher à insérer une ligne seulement après les sections du
fichier de configuration, dʼoù le motif suivant :

\[ \] pour rechercher les crochets de la section


\w+ nʼimporte quelle suite de caractères
le flag a
Enfin on insère la ligne # je suis ligne insérée

Supprimer des lignes dʼun texte

Pour supprimer des lignes, on utilise d pour delete.

Supprimer la ligne 7 dʼun fichier :

sed '7d'

Pour supprimer les 10 premières lignes dʼun fichier :

sed '1,10d'

Bien entendu, il est possible de supprimer des lignes avec un motif.


Par exemple, pour supprimer la ligne comportant une tabulation et 7 :

sed '/\t7/d' rose-tatoo.txt


Autre exemple où lʼon supprime toutes les lignes commentaires :

sed '/^#/d' config.conf

Supprimer la dernière ligne dʼun fichier :

sed '$d'

Pour supprimer les lignes identiques et consécutives dans un fichier :

sed '$!N; /^\(.*\)\n\1$/!P; D'

A lʼinverse pour supprimer toutes les lignes non identiques et


consécutives :
sed '$!N; s/^\(.*\)\n\1$/\1/; t; D'

Utiliser la valeur dʼune variable dans une commande


sed

La commande sed peut stocker le résultat dʼune recherche dʼun motif


dans une variable.
Pour cela, il faut lʼencadrer avec des parenthèses.
On lʼappelle ensuite avec \1, \2 qui correspond au numéro de la
parenthèses dans le motif.
Enfin on utilise /p pour print.

Imagions que lʼon cherche le mot motif.


Ici motif est encadrer dans la première parenthèse, donc on le stocke
dans la variable \1.

echo "Exemple de motif à rechercher"| sed -nre 's/.*(motif).*/\1/p'


motif

Alors quʼici, cʼest la second parenthèse donc \2.

echo "Exemple de motif à rechercher"| sed -nre 's/(.*)(motif)(.*)/\2/p'


motif

Par exemple pour extraire une URL complète dans un texte :

echo "Je suis une URL https://www.malekal.com/commande-sed-utilisation-et-exemples


https://www.malekal.com/commande-sed-utilisation-et-exemples/

Alors que pour extraire le nom dʼhôte dans un texte :

echo "Je suis une URL https://www.malekal.com/commande-sed-utilisation-et-exemples


www.malekal.com
Cela permet de stocker le résultat de la commande sed dans une variable,
ce qui est utilise dans les scripts BASH.
Par exemple pour stocker la valeur de la commande sed dans une variable
hote :

hote=$(echo $1|sed -nre 's/.*https?:\/\/(([A-Za-z0-9_-]+\.){2,}[a-z]+)(\/.*)?.*/\1

Vous aimerez peut-être aussi