Sysop.Fr
Cat├ęgories

apache

awk

bash

charmap

date

echo

encoding

find

grep

hexdump

irc

iso3166

ls

mysql

printf

python

read

sed

seq

smpp

sort

tar

ucp

Articles

Mémo de la commande sed

La commande sed "Stream EDitor" sert à transformer des chaines de caractères.

1. Afficher la 3ème ligne d'un fichier

root@debian:~# sed -n 3p input.txt
            

1. Afficher la dernière ligne d'un fichier

root@debian:~# sed -n -e '$p' input.txt
            

2. Afficher toutes les n lignes en partant du début d'un fichier

root@debian:~# sed -n 1~2p input.txt
            

3. Afficher uniquement les lignes correspondantes au motif

root@debian:~# sed -n '/motif/p' input.txt
root@debian:~# echo '1601565366' |sed -n '/^[0-9]\+$/p'
1601565366
root@debian:~# echo '1601565366' |sed -n '/^[0-9]\{10\}$/p'
1601565366
root@debian:~# echo '1601565366' |sed -n '/^[0-9]\{9\}$/p'
root@debian:~#
            

4. Afficher uniquement les lignes NE correspondant PAS au motif

root@debian:~# sed -n '/motif/!p' input.txt
            

5. Appeler plusieurs commandes sed

root@debian:~# sed -e 's/bonjour/bonsoir/g' -e 's/matin/soir/g' input.txt
            

6. Supprimer toutes les lignes vides d'un fichier

root@debian:~# sed -e '/^$/d' input.txt
            

7. Supprimer tous les espaces à la fin de toutes les lignes

root@debian:~# sed -e 's/ *$//' input.txt
            

8. Supprimer toutes les lignes contenant GUI

root@debian:~# sed -e '/GUI/d' input.txt
            

9. Supprimer toutes les instances de GUI en laissant le reste de la ligne intact

root@debian:~# sed -e 's/GUI//g' input.txt
            

10. Remplacer les lignes contenant GUI par une ligne blanche

root@debian:~# sed -e 's/GUI.*//g' input.txt
            

11. Remplacer la chaine "bonjour" par "bonsoir" dans chaque ligne

root@debian:~# sed -e 's/bonjour/bonsoir/' input.txt
            

12. Remplacer toutes les chaines "bonjour" par "bonsoir" dans chaque ligne

root@debian:~# sed -e 's/bonjour/bonsoir/g' input.txt
            

13. Extraire les paramètres d'un fichier INIFILE avec CNXSC=blahblah ou CNXSC="blah blah"

root@debian:~# CNXSC=`grep ^CNXSC ${INIFILE} |sed -e 's/CNXSC=//' -e 's/\"//g'`
            

14. Utilisation des sous-expressions et références arrières

root@debian:~# sed -e 's/...\(chaine1\)...\(chaine2\)...\(chaine3\).../\3;\1;\2/' input.txt
            

15. Extraire un champs d'un nom de fichier

root@debian:~# echo 20091130044315-1085114529-1-108511452900001-23442-675-8426.txt |sed -e 's/.*-\(.*\)\.txt/\1/'
8426

root@debian:~# echo 20091130044315-1085114529-1-108511452900001-23442-675-8426.txt |sed -e 's/\(.*\)-\(.*\)\.txt/\2/'
8426
            

16. Convertir en majuscule la 1ère lettre de chaque mot

root@debian:~# echo "orange pomme" | sed -e 's/\(\<[a-zA-Z]\)\([a-zA-Z]*\>\)/\u\1\L\2/g'
            

17. Convertir toute une chaine en majuscule

root@debian:~# echo fr |sed -e 's/\(.*\)/\U\1/g'
            

18. Convertir toute une chaine en minuscule

root@debian:~# echo tRx |sed -e 's/\(.*\)/\L\1/g'
            

19. Convertir toute une chaine en minuscule sauf les lettres T et R en majsucule

root@debian:~# echo tRX |sed -e 's/\(.*\)/\L\1/g' |sed -e 's/\(t\)/\u\1/g' |sed -e 's/\(r\)/\u\1/g'
            

20. Utiliser le résultat d'une commande find pour extraire une partie d'un nom de fichier avec sed

root@debian:~# find /tmp/spool/abcd/ -type f -name "*.txt" -print 2>/dev/null |head -5
/tmp/spool/abcd/20100122192009-1034755105-1-103475510500001-20740-92-8390.txt
/tmp/spool/abcd/20100122192432-1034792538-1-103479253800001-22190-92-8418.txt
/tmp/spool/abcd/20100122192653-1034824097-1-103482409700001-22190-92-8418.txt
/tmp/spool/abcd/20100122192308-1034773157-1-103477315700001-22190-92-8418.txt
/tmp/spool/abcd/20100122192024-1034760083-1-103476008300001-20740-92-8390.txt

root@debian:~# for file in $(find /tmp/spool/abcd/ -type f -name "*.txt" -print 2>/dev/null)
do
mydir=`echo $file|sed -e 's/.*\/.*\/.*\/.*\/\([0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]\).*/\1/'`
mv -v $file /tmp/spool/sorted/$mydir/
done
            

21. Modifier le contenu d'une liste de fichiers

root@debian:~# for file in $(ls -1 *.txt)
do
sed -e 's/3938.*/3938995642/' $file > $file.tmp
mv -v $file.tmp $file
done