FAQ LinuxConsultez toutes les FAQ

Nombre d'auteurs : 53, nombre de questions : 232, dernière mise à jour : 24 septembre 2017  Ajouter une question

 

Cette FAQ a été réalisée à partir des contributions des membres du forum Linux de Developpez.com et de l'équipe de rédaction. Merci à eux !

Nous sommes perpétuellement à l'écoute de vos suggestions et corrections, n'hésitez pas à nous en faire part sur le forum.


SommaireLe ShellLa commande sed (13)
précédent sommaire suivant
 

Sa syntaxe est la suivante :

sed [-option] [commande] [<fichier(s)>]
Par défaut, sed n'intervient pas directement dans le fichier, mais sur la sortie STDOUT.

Sans nom de fichier, sed s'applique sur le flux en entrée (redirection, pipe).

Ne pas oublier que sed fonctionne ligne par ligne. Si vous travaillez depuis une variable, contenant des retours chariot, avec un pipe vers sed, le contenu ne sera pas examiné en bloc !
sed peut davantage être considéré comme un éditeur en ligne de commande que comme une simple commande.

Mis à jour le 14 septembre 2017 Philippe Dpt35

Il suffit d'indiquer à sed les N° des lignes à supprimer.

Efface la ligne 5

Code bash : Sélectionner tout
sed '5d'

Efface les lignes 4 et 7
Code bash : Sélectionner tout
sed -e '4d; 7d'

Efface les lignes 4 à 7
Code bash : Sélectionner tout
sed '4,7 d'

Efface les lignes depuis la ligne 1 par pas de 2 (efface les lignes impaires)
Code bash : Sélectionner tout
sed '1~2 d'

Nous pouvons utiliser des jokers.

Efface la dernière ligne
Code bash : Sélectionner tout
sed '$d' mon_fichier.txt

Mis à jour le 15 septembre 2017 Philippe Dpt35

Efface toutes les lignes contenant "mot"

Code bash : Sélectionner tout
sed '/mot/d'

Efface toutes les lignes contenant mot1 et celles contenant mot2
Code bash : Sélectionner tout
sed -e '/mot1/;/mot2/d'

Efface toutes les lignes depuis celle contenant "mot1" à celle contenant "mot2" incluse
Code bash : Sélectionner tout
sed '/mot1/,/mot2/d'

Mis à jour le 15 septembre 2017 Philippe Dpt35

Pour les motifs, nous pouvons utiliser des jokers qui sont ceux des RegEx

^ correspond au début d'une ligne (juste avant le premier caractère)
$ correspond à la fin d'une ligne (juste après le dernier caractère)
. correspond à n'importe quel caractère unique
* correspond à aucune ou plusieurs occurrences du caractère qui précède
[ ] correspond à n'importe lequel des caractères cités entre les crochets
& prend la valeur du contenu du fichier avant modif = contenu fichier traité

Exemples de motifs

  • /./ Récupère toutes les lignes contenant au moins un caractère.

  • /../ Récupère toutes les lignes contenant au moins deux caractères.

  • /^#/ Récupère toutes les lignes commençant par un #.

  • /^$/ Récupère toutes les lignes vides.

  • /}$/ Récupère toutes les lignes finissant par un }.

  • /} *$/ Récupère toutes les lignes finissant par un } suivi ou non d'espaces.

  • /[abc]/ Récupère toutes les lignes contenant un des caractères a, b ou c.

  • /^[abc]/ Récupère toutes les lignes commençant soit par un a, soit un b, soit un c.


Exemples d'utilisation
Efface les lignes vides
Code bash : Sélectionner tout
sed  '/^$/d'
Efface toutes les lignes ne contenant qu'un seul caractère #
Code bash : Sélectionner tout
sed  '/^#$/d'
Supprime les lignes contenant des caractères numériques (au moins 1 chiffre) situés en fin de ligne
Code bash : Sélectionner tout
sed '/[0-9/][0-9]*$/d'

Mis à jour le 15 septembre 2017 Philippe Dpt35

Par exemple, pour supprimer les accents sur les e nous ferons

Code bash : Sélectionner tout
sed  'y/éèê/eee/'

Mis à jour le 15 septembre 2017 Philippe Dpt35

Remplace la 1re occurrence de "motif" par "substitution"

Code bash : Sélectionner tout
sed 's/motif/substitution/'
Remplace toutes les occurrences de "motif" par "substitution"
Code bash : Sélectionner tout
sed 's/motif/substitution/g'
Remplace la 3e occurrence de "motif" par "substitution"
Code bash : Sélectionner tout
sed 's/motif/substitution/3'

"motif" peut être un motif de RegEx
Remplace les chiffres par une croix
Code bash : Sélectionner tout
sed 's/[0-9]/x/g'

Mis à jour le 15 septembre 2017 Philippe Dpt35

Par défaut, sed agit sur la sortie STDOUT et non dans le fichier passé en paramètre.
Pour faire les modifications directement dans le fichier, il faut utiliser l'option -i

Code bash : Sélectionner tout
sed -i '5,7 d' /chemin/mon-fichier

On peut également utiliser les redirections.
Exemples:
Supprimer les lignes 5 à 7 et écrire le résultat dans mon-fichier-en-sortie
Code bash : Sélectionner tout
sed '5,7 d' /chemin/mon-fichier > /chemin/mon-fichier-en-sortie
Remplacer les caractères non alphanumériques par des espaces
Code bash : Sélectionner tout
sed 's/[^[:alnum:]!\;]/ /g' fichier-en-entrée.txt > fichier-en-sortie.txt

Mis à jour le 15 septembre 2017 Philippe Dpt35

Plusieurs commandes peuvent être appliquées à une même adresse ou un même motif en les entourant par des accolades :

[adresse[,adresse]]{commande1; commande2; commande3}

ou, autre syntaxe pour plus de lisibilité :

[adresse[,adresse]]{
commande1
commande2
commande3
}


Exemples:
Des lignes 3 à 5, supprime les accents sur les e et remplace les chiffres par des croix

Code bash : Sélectionner tout
sed '3,5 {y/éèê/eee/;s/[0-9]/x/g}'
Dans les lignes commençant par #, supprime les accents sur les e et remplace les chiffres par des croix
Code bash : Sélectionner tout
sed '/^#/ {y/éèê/eee/;s/[0-9]/x/g}'

Mis à jour le 15 septembre 2017 Philippe Dpt35

Plusieurs commandes différentes, séparées par des « ; », peuvent être appliquées grâce à l'option -e :
remplace "mot1" par "mot2" dans toutes les lignes et efface la troisième ligne

Code bash : Sélectionner tout
sed -e "s/mot1/mot2/g;3 d"

Mis à jour le 15 septembre 2017 Philippe Dpt35

Nous pouvons combiner adressage par N° de ligne et par motif
Efface la ligne 7 si elle commence par #

Code bash : Sélectionner tout
sed '/^#/,7 d'

Mis à jour le 15 septembre 2017 Philippe Dpt35

Si nous devons utiliser des caractères spéciaux, nous devons les échapper par \

Code bash : Sélectionner tout
sed -e "s/\/root/\/home/g"

NOTA: pour le problème des caractères spéciaux, sed permet de remplacer le délimiteur par défaut par le caractère de son choix (#,|,!,§,etc.) à partir du moment où il ne se trouve pas dans la composition du motif (ou la chaîne de remplacement) :
Code bash : Sélectionner tout
sed 's#/home/moi/docs#/mnt/serveur/docs#'

Mis à jour le 15 septembre 2017 Philippe Dpt35

sed reconnait la négation grâce au caractère "!"
Efface toutes les lignes sauf celles contenant #

Code bash : Sélectionner tout
sed '/#/!d'
À noter : nous pouvons obtenir le même résultat par
Code bash : Sélectionner tout
sed -n '/#/p
qui revient à dire « n'affiche que les lignes contenant # »

Mis à jour le 15 septembre 2017 Philippe Dpt35

Nous pouvons utiliser sed pour travailler sur le contenu d'une variable grâce aux pipes

Code bash : Sélectionner tout
1
2
3
4
5
ma_variable="Ceci est le contenu de ma variable 
qui contient plusieurs lignes 
1- certaines avec des N° 
# ou avec des commentaires" 
echo "$ma_variable" | sed "/^#/d"

Mis à jour le 15 septembre 2017 Philippe Dpt35

Proposer une nouvelle réponse sur la FAQ

Ce n'est pas l'endroit pour poser des questions, allez plutôt sur le forum de la rubrique pour ça


Réponse à la question

Liens sous la question
précédent sommaire suivant
 

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2017 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

 
Contacter le responsable de la rubrique Linux