15-03-2019
This commit is contained in:
674
docs/Linux/sed.md
Normal file
674
docs/Linux/sed.md
Normal file
@@ -0,0 +1,674 @@
|
||||
# sed
|
||||
|
||||
|
||||
|
||||
```bash
|
||||
$ cat test.txt
|
||||
red hat
|
||||
ubuntu
|
||||
mint
|
||||
debian
|
||||
raspbian
|
||||
```
|
||||
|
||||
#### Suppression de ligne:
|
||||
|
||||
Supprimer la <u>1ere ligne</u>:
|
||||
|
||||
```bash
|
||||
$ sed '1d' test.txt
|
||||
ubuntu
|
||||
mint
|
||||
debian
|
||||
raspbian
|
||||
|
||||
# le fichier test.txt n'est pas modifié
|
||||
```
|
||||
|
||||
```bash
|
||||
$ 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 <u>3eme ligne</u>:
|
||||
|
||||
```bash
|
||||
$ sed '3d' test.txt
|
||||
red hat
|
||||
ubuntu
|
||||
debian
|
||||
raspbian
|
||||
```
|
||||
|
||||
Supprimer la <u>dernière ligne</u>:
|
||||
|
||||
```bash
|
||||
$ sed '$d' test.txt
|
||||
red hat
|
||||
ubuntu
|
||||
mint
|
||||
debian
|
||||
```
|
||||
|
||||
Supprimer <u>de la 2eme à 4eme ligne</u>:
|
||||
|
||||
```bash
|
||||
$ sed '2,4d' test.txt
|
||||
red hat
|
||||
raspbian
|
||||
```
|
||||
|
||||
Supprimer les <u>lignes autres que de la 2eme à 4eme</u>:
|
||||
|
||||
```bash
|
||||
$ sed '2,4!d' test.txt
|
||||
ubuntu
|
||||
mint
|
||||
debian
|
||||
```
|
||||
|
||||
Supprimer la <u>1ere ET la dernière ligne</u>:
|
||||
|
||||
```bash
|
||||
$ sed '1d;$d' test.txt
|
||||
ubuntu
|
||||
mint
|
||||
debian
|
||||
```
|
||||
|
||||
Supprimer les lignes <u>commençant par le caractère 'u'</u>
|
||||
|
||||
```bash
|
||||
$ sed '/^u/d' test.txt
|
||||
red hat
|
||||
mint
|
||||
debian
|
||||
raspbian
|
||||
```
|
||||
|
||||
Supprimer les lignes se <u>terminant par le caractère 'n'</u>
|
||||
|
||||
```bash
|
||||
$ sed '/n$/d' test.txt
|
||||
red hat
|
||||
ubuntu
|
||||
mint
|
||||
```
|
||||
|
||||
Supprimer les lignes se <u>terminant par les caractères 'T', t', 'U' ou 'u'</u>
|
||||
|
||||
```bash
|
||||
$ sed '/[TtUu]$/d' test.txt
|
||||
debian
|
||||
raspbian
|
||||
```
|
||||
|
||||
Supprimer les lignes <u>vides</u>:
|
||||
|
||||
```bash
|
||||
$ sed '/^$/d' test.txt
|
||||
red hat
|
||||
ubuntu
|
||||
mint
|
||||
debian
|
||||
raspbian
|
||||
```
|
||||
|
||||
Supprimer les lignes <u>contenant l'expression 'red hat'</u>:
|
||||
|
||||
```bash
|
||||
$ sed '/red hat/d' test.txt
|
||||
ubuntu
|
||||
mint
|
||||
debian
|
||||
raspbian
|
||||
```
|
||||
|
||||
Supprimer les lignes <u>ne contenant pas l'expression 'red hat'</u>:
|
||||
|
||||
```bash
|
||||
$ sed '/red hat/!d' test.txt
|
||||
red hat
|
||||
```
|
||||
|
||||
Supprimer les lignes <u>contenant les expressions 'ubuntu' OU 'mint'</u>:
|
||||
|
||||
```bash
|
||||
$ sed '/ubuntu\|mint/d' test.txt
|
||||
red hat
|
||||
ubuntu
|
||||
mint
|
||||
debian
|
||||
raspbian
|
||||
|
||||
# ne fonctionne pas sous macOS ???
|
||||
```
|
||||
|
||||
Supprimer de la <u>1ere ligne à la ligne contenant l'expression 'ubuntu'</u>:
|
||||
|
||||
```bash
|
||||
$ sed '1,/ubuntu/d' test.txt
|
||||
mint
|
||||
debian
|
||||
raspbian
|
||||
```
|
||||
|
||||
Supprimer de la <u>ligne contenant l'expression 'ubuntu' jusqu'à la dernière ligne</u>:
|
||||
|
||||
```bash
|
||||
$ sed '/ubuntu/,$d' test.txt
|
||||
red hat
|
||||
```
|
||||
|
||||
Supprimer la <u>dernière ligne uniquement si elle contient l'expression 'raspbian'</u>:
|
||||
|
||||
```bash
|
||||
$ sed '${/raspbian/d;}' test.txt
|
||||
red hat
|
||||
ubuntu
|
||||
mint
|
||||
debian
|
||||
```
|
||||
|
||||
Supprimer la <u>dernière ligne uniquement si elle contient les expressions 'raspbian' ou 'debian'</u>:
|
||||
|
||||
```bash
|
||||
$ sed '${/raspbian\|debian/d;}' test.txt
|
||||
red hat
|
||||
ubuntu
|
||||
mint
|
||||
debian
|
||||
|
||||
# ne fonctionne pas sous macOS ???
|
||||
```
|
||||
|
||||
Supprime la ligne <u>contenant l'expression 'debian' uniquement. si elle est présente dans les lignes 1 à 4</u>:
|
||||
|
||||
```bash
|
||||
$ sed '1,4{/debian/d;}' test.txt
|
||||
red hat
|
||||
ubuntu
|
||||
mint
|
||||
raspbian
|
||||
```
|
||||
|
||||
Supprime la <u>contenant l'expression 'mint' ET la ligne suivante</u>:
|
||||
|
||||
```bash
|
||||
$ sed '/mint/{N;d;}' test.txt
|
||||
red hat
|
||||
ubuntu
|
||||
raspbian
|
||||
```
|
||||
|
||||
Supprime la <u>ligne suivante celle contenant l'expression 'mint'</u>:
|
||||
|
||||
```bash
|
||||
$ sed '/mint/{N;s/\n.*//;}' test.txt
|
||||
red hat
|
||||
ubuntu
|
||||
mint
|
||||
raspbian
|
||||
```
|
||||
|
||||
Supprime la <u>ligne contenant l'expression 'mint' ET la ligne précédente</u>:
|
||||
|
||||
```bash
|
||||
$ sed -n '/mint/{s/.*//;x;d;};x;p;${x;p;}' test.txt | sed '/^$/d'
|
||||
red hat
|
||||
debian
|
||||
raspbian
|
||||
```
|
||||
|
||||
Supprime la <u>ligne précedent celle contenant l'expression 'mint'</u>:
|
||||
|
||||
```bash
|
||||
$ sed -n '/mint/{x;d;};1h;1!{x;p;};${x;p;}' test.txt
|
||||
red hat
|
||||
mint
|
||||
debian
|
||||
raspbian
|
||||
```
|
||||
|
||||
Supprime la <u>ligne contenant l'expression 'mint', ainsi que la précédente et la suivante</u>:
|
||||
|
||||
```bash
|
||||
$ sed -n '/mint/{N;s/.*//;x;d;};x;p;${x;p;}' test.txt | sed '/^$/d'
|
||||
red hat
|
||||
raspbian
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### Affichage de ligne:
|
||||
|
||||
Afficher uniquement la <u>1ere ligne</u>:
|
||||
|
||||
```bash
|
||||
$ sed -n '1p' test.txt
|
||||
red hat
|
||||
```
|
||||
|
||||
Afficher la <u>dernière ligne</u>:
|
||||
|
||||
```bash
|
||||
$ sed -n '$p' test.txt
|
||||
raspbian
|
||||
```
|
||||
|
||||
Afficher les lignes qui <u>ne contiennent pas 'b'</u>:
|
||||
|
||||
```bash
|
||||
$ sed -n '/b/!p' test.txt
|
||||
red hat
|
||||
mint
|
||||
```
|
||||
|
||||
Afficher les lignes qui <u>contiennent 'h' ou 't'</u>:
|
||||
|
||||
```bash
|
||||
$ sed -n '/[ht]/p' test.txt
|
||||
red hat
|
||||
ubuntu
|
||||
mint
|
||||
```
|
||||
|
||||
Afficher les lignes <u>se terminant par 'n' ou 'N'</u>:
|
||||
|
||||
```bash
|
||||
$ sed -n '/[nN]$/p' test.txt
|
||||
debian
|
||||
raspbian
|
||||
```
|
||||
|
||||
Afficher les lignes qui <u>commencent par 'm' ou 'u'</u>:
|
||||
|
||||
```bash
|
||||
$ sed -n '/^m\|^u/p' test.txt
|
||||
# Ne marche pas sous macOS ???
|
||||
```
|
||||
|
||||
Afficher <u>1 ligne sur 2</u>:
|
||||
|
||||
```bash
|
||||
$ sed 'n;d' test.txt
|
||||
red hat
|
||||
mint
|
||||
raspbian
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### Suprression de caractères:
|
||||
|
||||
Commande:
|
||||
|
||||
```bash
|
||||
$ sed 's/find/replace/' file
|
||||
```
|
||||
|
||||
Supprimer le caractère 'a'
|
||||
|
||||
```bash
|
||||
# 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:
|
||||
|
||||
```bash
|
||||
$ 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:
|
||||
|
||||
```bash
|
||||
$ sed 's/.$//' test.txt
|
||||
red ha
|
||||
ubunt
|
||||
min
|
||||
debia
|
||||
raspbia
|
||||
```
|
||||
|
||||
Supprimer les 1er et dernier caractères de chaque ligne:
|
||||
|
||||
```bash
|
||||
$ 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'):
|
||||
|
||||
```bash
|
||||
$ 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 'u'):
|
||||
|
||||
```bash
|
||||
$ sed 's/n$//' test.txt
|
||||
red hat
|
||||
ubuntu
|
||||
mint
|
||||
debia
|
||||
raspbia
|
||||
```
|
||||
|
||||
Supprimer les 3 premiers caractères de chaque ligne:
|
||||
|
||||
```bash
|
||||
$ sed 's/...//' test.txt
|
||||
hat
|
||||
ntu
|
||||
t
|
||||
ian
|
||||
pbian
|
||||
```
|
||||
|
||||
Supprimer les n premiers caractères de chaque ligne (ici 3):
|
||||
|
||||
```bash
|
||||
$ sed -r 's/.{3}//' test.txt
|
||||
|
||||
# ne fonctionne pas sous macOS
|
||||
```
|
||||
|
||||
Supprimer les n derniers caractères de chaque ligne (ici 3):
|
||||
|
||||
```bash
|
||||
$ sed -r 's/.{3}$//'
|
||||
|
||||
# ne fonctionne pas sous macOS
|
||||
```
|
||||
|
||||
Tout supprimer sauf les n premiers caractères de chaque ligne (ici 3):
|
||||
|
||||
```bash
|
||||
$ 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):
|
||||
|
||||
```bash
|
||||
$ sed -r 's/.*(.{3})/\1/' test.txt
|
||||
|
||||
# ne fonctionne pas sous macOS
|
||||
```
|
||||
|
||||
Supprimer plusieurs caractères (ici toutes les voyelles):
|
||||
|
||||
```bash
|
||||
$ sed 's/[aeiou]//g' test.txt
|
||||
rd ht
|
||||
bnt
|
||||
mnt
|
||||
dbn
|
||||
rspbn
|
||||
```
|
||||
|
||||
Supprimer une expression ('bia'):
|
||||
|
||||
```bash
|
||||
$ sed 's/bia//g' test.txt
|
||||
red hat
|
||||
ubuntu
|
||||
mint
|
||||
den
|
||||
raspn
|
||||
```
|
||||
|
||||
Supprimer seulement la n ième occurence d'un caractère:
|
||||
|
||||
```bash
|
||||
$ sed 's/u//2' test.txt
|
||||
red hat
|
||||
ubntu
|
||||
mint
|
||||
debian
|
||||
raspbian
|
||||
```
|
||||
|
||||
Tout supprimer après le caractère spécifié ('b'):
|
||||
|
||||
```bash
|
||||
$ sed 's/b.*//' test.txt
|
||||
red hat
|
||||
u
|
||||
mint
|
||||
de
|
||||
rasp
|
||||
```
|
||||
|
||||
Supprimer tous les nombres:
|
||||
|
||||
```bash
|
||||
$ sed 's/[0-9]//g' test.txt
|
||||
```
|
||||
|
||||
Supprimer toutes les minuscules:
|
||||
|
||||
```bash
|
||||
$ sed 's/[a-z]//g' test.txt
|
||||
|
||||
|
||||
|
||||
|
||||
$
|
||||
# supprime les caractères mais laisse des lignes vides
|
||||
```
|
||||
|
||||
Supprimer tout sauf les minuscules:
|
||||
|
||||
```bash
|
||||
$ sed 's/[^a-z]//g' test.txt
|
||||
redhat
|
||||
ubuntu
|
||||
mint
|
||||
debian
|
||||
raspbian
|
||||
```
|
||||
|
||||
Supprimer tous les caractères alpha-numériques:
|
||||
|
||||
```bash
|
||||
$ 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:
|
||||
|
||||
```bash
|
||||
$ sed 's/[uU]//g' test.txt
|
||||
red hat
|
||||
bnt
|
||||
mint
|
||||
debian
|
||||
raspbian
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### Remplacement de caractères:
|
||||
|
||||
Ajouter une expression en début de ligne:
|
||||
|
||||
```bash
|
||||
$ sed 's/^/Distrib: /' test.txt
|
||||
Distrib: red hat
|
||||
Distrib: ubuntu
|
||||
Distrib: mint
|
||||
Distrib: debian
|
||||
Distrib: raspbian
|
||||
```
|
||||
|
||||
Ajouter une expression en fin de ligne:
|
||||
|
||||
```bash
|
||||
$ 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):
|
||||
|
||||
```bash
|
||||
$ sed 's/a/A/' test.txt
|
||||
red hAt
|
||||
ubuntu
|
||||
mint
|
||||
debiAn
|
||||
rAspbian
|
||||
```
|
||||
|
||||
Substituer tous les caractères:
|
||||
|
||||
```bash
|
||||
$ sed 's/a/A/g' test.txt
|
||||
red hAt
|
||||
ubuntu
|
||||
mint
|
||||
debiAn
|
||||
rAspbiAn
|
||||
```
|
||||
|
||||
Subsituer uniquement la 2nde occurence:
|
||||
|
||||
```bash
|
||||
$ sed 's/a/A/2' test.txt
|
||||
red hat
|
||||
ubuntu
|
||||
mint
|
||||
debian
|
||||
raspbiAn
|
||||
```
|
||||
|
||||
Subsituer toutes les occurences à partir de la 2nde:
|
||||
|
||||
```bash
|
||||
$ sed 's/u/U/2g' test.txt
|
||||
|
||||
# ne fonctionne pas sous macOS
|
||||
```
|
||||
|
||||
Substituer uniquement sur le n eme ligne (3eme):
|
||||
|
||||
```bash
|
||||
$ sed '3s/n/N/g' test.txt
|
||||
red hat
|
||||
ubuntu
|
||||
miNt
|
||||
debian
|
||||
raspbian
|
||||
```
|
||||
|
||||
Subtituer uniquement de la 3e à la 4e ligne:
|
||||
|
||||
```bash
|
||||
$ sed '3,4s/n/N/g' test.txt
|
||||
red hat
|
||||
ubuntu
|
||||
miNt
|
||||
debiaN
|
||||
raspbian
|
||||
```
|
||||
|
||||
Remplacer la ligne entière:
|
||||
|
||||
```bash
|
||||
$ 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:
|
||||
|
||||
```bash
|
||||
$ sed 's/a/A/g; s/u/uUu/g' test.txt
|
||||
red hAt
|
||||
uUubuUuntuUu
|
||||
mint
|
||||
debiAn
|
||||
rAspbiAn
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### Ajouter une ligne (à voir pour macOS):
|
||||
|
||||
Ajouter une ligne d'entête:
|
||||
|
||||
```bash
|
||||
$ sed '1i Employee, EmpId' test.txt
|
||||
# GNU sed, ne marche pas pour macOS
|
||||
```
|
||||
|
||||
Ajouter '————————' après la ligne d'entête:
|
||||
|
||||
```bash
|
||||
$ sed -i '1a ---------------' test.txt
|
||||
```
|
||||
|
||||
Ajouter une ligne tout à la fin:
|
||||
|
||||
```bash
|
||||
$ sed -i '$a ---------------' test.txt
|
||||
```
|
||||
Reference in New Issue
Block a user