Sysop.Fr
Catégories

apache

awk

bash

charmap

date

echo

encoding

find

grep

hexdump

irc

iso3166

ls

mysql

od

openssh

printf

python

read

sed

seq

smpp

sort/uniq

tar

tr

ucp

Articles

Mémo de la commande sed

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

1. Compter le nombre de ligne(s) d'un fichier

root@debian:~# sed -n "$=" input.txt
            

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

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

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

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

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

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

5. 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:~#
            

6. Afficher uniquement les lignes NE correspondant PAS au motif

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

7. Appeler plusieurs commandes sed

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

8. Supprimer toutes les lignes vides d'un fichier

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

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

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

10. Supprimer toutes les lignes contenant GUI

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

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

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

12. Remplacer les lignes contenant GUI par une ligne blanche

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

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

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

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

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

15. 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'`
            

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

Voir uniquement les lignes qui seront modifiées:
root@debian:~# sed -n -e 's/...\(chaine1\)...\(chaine2\)...\(chaine3\).../\3;\1;\2/p' input.txt
            
Appliquer les changements:
root@debian:~# sed -e 's/...\(chaine1\)...\(chaine2\)...\(chaine3\).../\3;\1;\2/' input.txt
            

17. 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'
            

18. Convertir toute une chaine en majuscule

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

19. Convertir toute une chaine en minuscule

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

20. 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'
            

21. 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
            

22. 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
            

23. Modifier le contenu d'une liste de fichiers (mode interactif)

root@debian:~# while read -r myfile; do
    echo "myfile=${myfile}"
    cp -pv ${myfile} ${myfile}.$(date +"%Y%m%d%H%M")
    sed -i -e "s/timeout = 15000/timeout = 30000/" ${myfile}
done <<< "$( grep -l "timeout = 15000" /tmp/*.txt )"