FAQ LinuxConsultez toutes les FAQ
Nombre d'auteurs : 56, nombre de questions : 260, dernière mise à jour : 27 juin 2022 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.
- Comment la commande sed s'utilise-t-elle ?
- Comment supprimer des lignes précises ?
- Comment supprimer des lignes contenant certains caractères ?
- Comment supprimer des lignes selon un motif ?
- Comment remplacer des caractères par d'autres ?
- Comment ajouter du texte ?
- Comment substituer des mots ou des motifs à d'autres ?
- Comment effectuer des modifications directement dans un fichier ?
- Comment appliquer plusieurs commandes à une même adresse ou un même motif ?
- Comment appliquer une suite de commandes différentes ?
- Comment faire lorsque des caractères à modifier sont des caractères spéciaux ?
- Comment effacer toutes les lignes sauf certaines ?
- Comment utiliser sed avec le contenu d'une variable ?
- Comment afficher les lignes comprises entre une ligne commençant par un mot et une autre se terminant par un autre mot ?
Sa syntaxe est la suivante :
sed [-option] [commande] [<fichier(s)>]
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 ! |
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
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'
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'
Code bash : | Sélectionner tout |
sed '/^#$/d'
Code bash : | Sélectionner tout |
sed '/[0-9][0-9]*$/d'
Par exemple, pour supprimer les accents sur les e nous ferons
Code bash : | Sélectionner tout |
sed 'y/éèê/eee/'
a ajoute du texte après la ligne indiquée, i l'ajoute avant.
Ajouter une ligne avec un texte après la ligne 2 :
Code Bash : | Sélectionner tout |
1 2 | sed '2 a# Ceci est une ligne de commentaire' |
Ajouter une ligne avec un texte avant la ligne 2 :
Code Bash : | Sélectionner tout |
1 2 | sed '2 i# Ceci est une ligne de commentaire' |
Ajouter une ligne avec un texte après chaque ligne ne commençant pas par # ;
Code Bash : | Sélectionner tout |
1 2 | sed '/^#/! a# Ceci est une ligne de commentaire' |
Remplace la 1re occurrence de "motif" par "substitution"
Code bash : | Sélectionner tout |
sed 's/motif/substitution/'
Code bash : | Sélectionner tout |
sed 's/motif/substitution/g'
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'
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
Code bash : | Sélectionner tout |
sed 's/[^[:alnum:]!\;]/ /g' fichier-en-entrée.txt > fichier-en-sortie.txt
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}'
Code bash : | Sélectionner tout |
sed '/^#/ {y/éèê/eee/;s/[0-9]/x/g}'
Il est possible de grouper plusieurs commandes sed.
Première méthode : En les séparant par des caractères ";" :
Code bash : | Sélectionner tout |
sed "s/mot1/mot2/g;3 d"
Deuxième méthode : en les écrivant les unes à la suite des autres avec l'option -e
Code bash : | Sélectionner tout |
sed -e 's/mot1/mot2/g' -e '3 d'
La première méthode ne fonctionnera pas dans toutes les circonstances. Par exemple, pour ajouter une ligne avant et après la ligne 3 (i pour ajouter avant la ligne, a pour ajouter après la ligne) :
Code bash : | Sélectionner tout |
sed -e '3 iajout avant la ligne' -e '3 aajout après la ligne' mon-fichier.txt
-->
Code shell : | Sélectionner tout |
1 2 3 | ajout avant la ligne contenu de la ligne 3 ajout après la ligne |
mais
Code bash : | Sélectionner tout |
sed '3 iajout avant la ligne;3 aajout après la ligne' mon-fichier.txt
donnera :
Code shell : | Sélectionner tout |
1 2 | ajout avant la ligne;3 aajout après la ligne contenu de la ligne 3 |
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#'
sed reconnait la négation grâce au caractère "!"
Efface toutes les lignes sauf celles contenant #
Code bash : | Sélectionner tout |
sed '/#/!d'
Code bash : | Sélectionner tout |
sed -n '/#/p
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" |
Code Bash : | Sélectionner tout |
1 2 | sed -n -e '/^mot1/,/mot2$/p' nom_fichier |
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 çaLes 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 © 2024 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.