Aller au contenu

sed

$ cat test.txt
red hat
ubuntu
mint
debian
raspbian

Suppression de ligne:

Supprimer la 1ere ligne:

$ sed '1d' test.txt
ubuntu
mint
debian
raspbian

# le fichier test.txt n'est pas modifié
$ sed -i .bak '1d' test.txt
$ cat test.txt
ubuntu
mint
debian
raspbian
$ cat test.txt.bak
red hat
ubuntu
mint
debian
raspbian

# le fichier test.txt est sauvegardé en test.txt.bak
# le fichier test.txt est modifié
# Sinon pour masOS
$ sed -i '' '1d' test.txt

Supprimer la 3eme ligne:

$ sed '3d' test.txt
red hat
ubuntu
debian
raspbian

Supprimer la dernière ligne:

$ sed '$d' test.txt
red hat
ubuntu
mint
debian

Supprimer de la 2eme à 4eme ligne:

$ sed '2,4d' test.txt
red hat
raspbian

Supprimer les lignes autres que de la 2eme à 4eme:

$ sed '2,4!d' test.txt
ubuntu
mint
debian

Supprimer la 1ere ET la dernière ligne:

$ sed '1d;$d' test.txt
ubuntu
mint
debian

Supprimer les lignes commençant par le caractère 'u'

$ sed '/^u/d' test.txt
red hat
mint
debian
raspbian

Supprimer les lignes se terminant par le caractère 'n'

$ sed '/n$/d' test.txt
red hat
ubuntu
mint

Supprimer les lignes se terminant par les caractères 'T', t', 'U' ou 'u'

$ sed '/[TtUu]$/d' test.txt
debian
raspbian

Supprimer les lignes vides:

$ sed '/^$/d' test.txt
red hat
ubuntu
mint
debian
raspbian

Supprimer les lignes contenant l'expression 'red hat':

$ sed '/red hat/d' test.txt
ubuntu
mint
debian
raspbian

Supprimer les lignes ne contenant pas l'expression 'red hat':

$ sed '/red hat/!d' test.txt
red hat

Supprimer les lignes contenant les expressions 'ubuntu' OU 'mint':

$ sed '/ubuntu\|mint/d' test.txt
red hat
ubuntu
mint
debian
raspbian

# ne fonctionne pas sous macOS ???

Supprimer de la 1ere ligne à la ligne contenant l'expression 'ubuntu':

$ sed '1,/ubuntu/d' test.txt
mint
debian
raspbian

Supprimer de la ligne contenant l'expression 'ubuntu' jusqu'à la dernière ligne:

$ sed '/ubuntu/,$d' test.txt
red hat

Supprimer la dernière ligne uniquement si elle contient l'expression 'raspbian':

$ sed '${/raspbian/d;}' test.txt
red hat
ubuntu
mint
debian

Supprimer la dernière ligne uniquement si elle contient les expressions 'raspbian' ou 'debian':

$ sed '${/raspbian\|debian/d;}' test.txt
red hat
ubuntu
mint
debian

# ne fonctionne pas sous macOS ???

Supprime la ligne contenant l'expression 'debian' uniquement. si elle est présente dans les lignes 1 à 4:

$ sed '1,4{/debian/d;}' test.txt
red hat
ubuntu
mint
raspbian

Supprime la contenant l'expression 'mint' ET la ligne suivante:

$ sed '/mint/{N;d;}' test.txt
red hat
ubuntu
raspbian

Supprime la ligne suivante celle contenant l'expression 'mint':

$ sed '/mint/{N;s/\n.*//;}' test.txt
red hat
ubuntu
mint
raspbian

Supprime la ligne contenant l'expression 'mint' ET la ligne précédente:

$ sed -n '/mint/{s/.*//;x;d;};x;p;${x;p;}' test.txt | sed '/^$/d'
red hat
debian
raspbian

Supprime la ligne précedent celle contenant l'expression 'mint':

$ sed -n '/mint/{x;d;};1h;1!{x;p;};${x;p;}' test.txt
red hat
mint
debian
raspbian

Supprime la ligne contenant l'expression 'mint', ainsi que la précédente et la suivante:

$ sed -n '/mint/{N;s/.*//;x;d;};x;p;${x;p;}' test.txt | sed '/^$/d'
red hat
raspbian

Affichage de ligne:

Afficher uniquement la 1ere ligne:

$ sed -n '1p' test.txt
red hat

Afficher uniquement la 3eme ligne:

$ sed -n '3p' test.txt
mint

Afficher la dernière ligne:

$ sed -n '$p' test.txt
raspbian

Afficher les lignes qui ne contiennent pas 'b':

$ sed -n '/b/!p' test.txt
red hat
mint

Afficher les lignes qui contiennent 'h' ou 't':

$ sed -n '/[ht]/p' test.txt
red hat
ubuntu
mint

Afficher les lignes se terminant par 'n' ou 'N':

$ sed -n '/[nN]$/p' test.txt
debian
raspbian

Afficher les lignes qui commencent par 'm' ou 'u':

$ sed -n '/^m\|^u/p' test.txt
# Ne marche pas sous macOS ???

Afficher 1 ligne sur 2:

$ sed 'n;d' test.txt
red hat
mint
raspbian

Afficher les lignes 3 à 5:

$ sed -n '3,5p' test.txt
mint
debian
raspbian

Afficher les n emes lignes:

# affiche les lignes 3..6..9..
# GNU sed
$ sed -n '0~3p' test.txt

Supression de caractères:

Commande:

$ sed 's/find/replace/' file

Supprimer le caractère 'a'

# supprimer le 1er caractère trouvé
$ sed 's/a//' test.txt
red ht
ubuntu
mint
debin
rspbian

# supprimer tous les caractères
$ sed 's/a//g' test.txt
red ht
ubuntu
mint
debin
rspbin

Supprimer le 1er caractère de chaque ligne:

$ sed 's/^.//' test.txt
ed hat
buntu
int
ebian
aspbian

# autre commande identique
$ sed 's/.//' test.txt

Supprimer le dernier caractère de chaque ligne:

$ sed 's/.$//' test.txt
red ha
ubunt
min
debia
raspbia

Supprimer les 1er et dernier caractères de chaque ligne:

$ sed 's/.//;s/.$//' test.txt
ed ha
bunt
in
ebia
aspbia

Supprimer le 1er caractère de chaque ligne, mais seulement celui spécifié (ici le 'u'):

$ sed 's/^u//' test.txt
red hat
buntu
mint
debian
raspbian

Supprimer le dernier caractère de chaque ligne, mais seulement celui spécifié (ici le 'n'):

$ sed 's/n$//' test.txt
red hat
ubuntu
mint
debia
raspbia

Supprimer les 3 premiers caractères de chaque ligne:

$ sed 's/...//' test.txt
 hat
ntu
t
ian
pbian 

Supprimer les n premiers caractères de chaque ligne (ici 3):

$ sed -r 's/.{3}//' test.txt

# ne fonctionne pas sous macOS

Supprimer les n derniers caractères de chaque ligne (ici 3):

$ sed -r 's/.{3}$//'

# ne fonctionne pas sous macOS

Tout supprimer sauf les n premiers caractères de chaque ligne (ici 3):

$ sed -r 's/(.{3}).*/\1/' test.txt

# ne fonctionne pas sous macOS

Tout supprimer sauf les n derniers caractères de chaque ligne (ici 3):

$ sed -r 's/.*(.{3})/\1/' test.txt

# ne fonctionne pas sous macOS

Supprimer plusieurs caractères (ici toutes les voyelles):

$ sed 's/[aeiou]//g' test.txt
rd ht
bnt
mnt
dbn
rspbn

Supprimer une expression ('bia'):

$ sed 's/bia//g' test.txt
red hat
ubuntu
mint
den
raspn

Supprimer seulement la n ième occurence d'un caractère:

$ sed 's/u//2' test.txt
red hat
ubntu
mint
debian
raspbian

Tout supprimer après le caractère spécifié ('b'):

$ sed 's/b.*//' test.txt
red hat
u
mint
de
rasp

Supprimer tous les nombres:

$ sed 's/[0-9]//g' test.txt

Supprimer toutes les minuscules:

$ sed 's/[a-z]//g' test.txt




$
# supprime les caractères mais laisse des lignes vides

Supprimer tout sauf les minuscules:

$ sed 's/[^a-z]//g' test.txt
redhat
ubuntu
mint
debian
raspbian

Supprimer tous les caractères alpha-numériques:

$ sed 's/[a-zA-Z0-9]//g' test.txt




$
# supprime les caractères mais laisse des lignes vides

Supprimer minuscule et majuscule d'un caractère:

$ sed 's/[uU]//g' test.txt
red hat
bnt
mint
debian
raspbian

Remplacement de caractères:

Ajouter une expression en début de ligne:

$ sed 's/^/Distrib: /' test.txt
Distrib: red hat
Distrib: ubuntu
Distrib: mint
Distrib: debian
Distrib: raspbian

Ajouter une expression en fin de ligne:

$ sed 's/$/ Tux ruleeeeez/' test.txt
red hat Tux ruleeeeez
ubuntu Tux ruleeeeez
mint Tux ruleeeeez
debian Tux ruleeeeez
raspbian Tux ruleeeeez

Substituer un caractère (le 1er trouvé de chaque ligne):

$ sed 's/a/A/' test.txt
red hAt
ubuntu
mint
debiAn
rAspbian

Substituer tous les caractères:

$ sed 's/a/A/g' test.txt
red hAt
ubuntu
mint
debiAn
rAspbiAn

Subsituer uniquement la 2nde occurence:

$ sed 's/a/A/2' test.txt
red hat
ubuntu
mint
debian
raspbiAn

Subsituer toutes les occurences à partir de la 2nde:

$ sed 's/u/U/2g' test.txt

# ne fonctionne pas sous macOS

Substituer uniquement sur le n eme ligne (3eme):

$ sed '3s/n/N/g' test.txt
red hat
ubuntu
miNt
debian
raspbian

Subtituer uniquement de la 3e à la 4e ligne:

$ sed '3,4s/n/N/g' test.txt
red hat
ubuntu
miNt
debiaN
raspbian

Remplacer la ligne entière:

$ sed 's/.*/& is a distrib Linux/' test.txt
red hat is a distrib Linux
ubuntu is a distrib Linux
mint is a distrib Linux
debian is a distrib Linux
raspbian is a distrib Linux

Multiples substitutions:

$ sed 's/a/A/g; s/u/uUu/g' test.txt
red hAt
uUubuUuntuUu
mint
debiAn
rAspbiAn

Ajout de caractères:

Ajouter un (ou plusieurs) caractère (#) en début de ligne:

$ sed 's/^/#/' test.txt
#red hat
#ubuntu
#mint
#debian
#raspbian

$ sed 's/^/#Prefixe: &/' test.txt
#Prefixe: red hat
#Prefixe: ubuntu
#Prefixe: mint
#Prefixe: debian
#Prefixe: raspbian

# Pour modifier le fichiet
$ sed -i 's/^/#/' file.txt

Ajouter un (ou plusieurs) caractère (#) en fin de ligne:

$ sed 's/$/#/' test.txt
red hat#
ubuntu#
mint#
debian#
raspbian#

$ sed 's/$/ _suffixe/' test.txt
red hat _suffixe
ubuntu _suffixe
mint _suffixe
debian _suffixe
raspbian _suffixe

# Pour modifier le fichiet
$ sed -i 's/$/#/' file.txt

Ajouter un (ou plusieurs) caractère (#) en début d'une ligne précise:

$ sed 2's/^/#Prefixe: &/' test.txt
red hat
#Prefixe: ubuntu
mint
debian
raspbian

Si on ne connait pas le numéro de ligne:

$ sed 's/ubuntu/Prefixe: &/' test.txt
red hat
Prefixe: ubuntu
mint
debian
raspbian

# ou trouver le numero:
$ grep -n "ubuntu" test.txt | cut -d: -f -1
2

Ajouter un (ou plusieurs) caractère (#) en fin d'une ligne précise:

$ sed 3's/$/ _suffixe &/' test.txt
red hat
ubuntu
mint _suffixe
debian
raspbian

Ajouter un (ou plusieurs) caractère en début ET en fin d'une ligne précise:

$ sed 2's/.*/#Prefixe: & _suffixe/' test.txt
red hat
#Prefixe: ubuntu _suffixe
mint
debian
raspbian

Ajouter une ligne (à voir pour macOS):

Ajouter une ligne d'entête:

$ sed '1i Employee, EmpId' test.txt
# GNU sed, ne marche pas pour macOS

Ajouter '————————' après la ligne d'entête:

$ sed -i '1a ---------------' test.txt 

Ajouter une ligne tout à la fin:

$ sed -i '$a ---------------' test.txt

https://wiki.maxcorp.org/sed/


Dernière mise à jour: July 25, 2021