System-Linux

Aller au contenu | Aller au menu | Aller à la recherche

Commande Sed

Quelques lignes de commandes avec sed qui peuvent simplifier la vie d'un admin !

SED :

A lire : http://www.lmd.ens.fr/Ressources-Info/Unix-Doc/html/cours-unix-12.html et aussi : http://fr.wikipedia.org/wiki/Sed_%28logiciel%29

Ce qu'il faut savoir :

Un champ est défini par une expression rationnelle identifiée par les balises \( et \)

^ 	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é 
/./ 	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. 

Parcourir un fichier et afficher que certaines lignes :

sed -n '10,12p' passwd
new:x:8:12:news:/etc/news:
ucp:x:13:11:uucp:/var/spool/uucp:/sbin/nologin
operato:x:10:0:operator:/root:/sbin/nologin

ici la ligne 10 à 12.

sed -n '1p'

et la juste la première ligne.

Changer un mot par un autre dans vi avec sed :

:%s/mot/mot1/g

dans le fichier ouvert tous les "mot" seront remplacés par "mot1"

Si on a besoin de remplacer une chaîne par une autre pour toute une liste de fichiers contenu dans un répertoire, on pourra utiliser ce petit script :

#!/bin/bash
for file in *.sh
do
echo “Traitement de $file …”
sed -e “s/chaine1/chaine2/g” “$file” > “$file”.tmp && mv -f “$file”.tmp “$file”
done

Ce script va afficher la liste de tous les fichiers dont l’extension est .sh et faire le remplacement.

Afficher que les lignes non commentées d'un fichier :

cat fichier.conf | sed -e '/^#.*$/d'

Exemple ou l'on remplace le répertoire /root par /home :

sed -e "s/\/root/\/home/g" fichier > fichier.tmp && mv -f fichier.tmp fichier 

Comme vous pouvez le voir vous êtes obligé d'échapper les caractères spéciaux.

Remplacer une chaîne par une autre pour une liste de fichiers dans un répertoire, on pourra utiliser ce petit script shell :

 
#!/bin/bash
for file in *.txt
do
echo 'Traitement de $file ...'
sed -e 's/chaine1/chaine2/g' '$file' > '$file'.tmp && mv -f '$file'.tmp '$file'
done 

Mettre tout le contenu d'un fichier en majuscule :

sed -i -e 's/.*/\U&/'

Mettre tout le contenu d'un fichier en minuscule :

sed -i -e 's/.*/\L&/'

Ajouter un mot ou plus devant chaque ligne d'un fichier :

sed -e 's/.*/mot ou plus &/' appli

Ajouter un mot ou plus après chaque ligne d'un fichier :

sed -e 's/.*/& mot ou plus/' appli

Ajouter enable à la fin de la ligne comprenant le mot arg1 et arg2 :

sed -i -e 's/^\(arg1.*arg2\).*$/&1 enable/g' Fichier.txt

Afficher la ligne 3 d'un fichier :

sed -n 3p fichier.txt

Commenter un ligne contenant le mot httpd :

sed -i -e 's/.*httpd.*/#$/g' fichier.txt

Insérer une nouvelle ligne sous/après une autre :

le fichier contient :

lol
ola
mh
pou

on insert le mot : client après le mot : ola

sed -i '/ola/a \client' fichier

Suppression d'une ligne commençant par le mot : football

sed -i -e '/^football/d' fichier

Autre chose à savoir parce que bien pratique :

Quand vous modifiez des fichiers il est recommandé de créer un fichier de backup au cas ou :

utiliser l'option -i.bak

Pleins d'autres exemples :

http://www.minet.net/spip/spip.php?article74 http://www.commentcamarche.net/faq/sujet-6699-sed-trucs-et-astuces#intervalle-regulier http://www.prod-info.fr/Unix/Unix-Initiation-a-Sed.html http://sed.sourceforge.net/sed1line_fr.html

Par GanGan | le dimanche, décembre 21 2008 15:25

Commentaires

1. Patrick

vendredi, décembre 4 2009 | 18:16

si ça marchait ce serait mieux

2. gangan

mardi, décembre 15 2009 | 11:22

Qu'est ce qui ne marche pas mon jeune ami ?

3. philippe

vendredi, janvier 29 2010 | 22:04

bonjour
je voudrais inseré une ligne ex '192.168.0.100 poste0'
dans un fichier txt, en dessous d'une ligne connu ex 'adresse du poste backup' avec sed es que cela ai possible ?? merci de votre reponse

4. GanGan

vendredi, janvier 29 2010 | 23:59

Avec l'option : a

je crois.

5. rkusnik

dimanche, novembre 21 2010 | 11:58

Bonjour, ce tutoriel est vraiment tres bien fait. Bravo à celui qui l'a rédigé.

Phillipe si tu souhaite ajouter une ligne dans un fichier txt en dessous d'une ligne connue. Il faut utiliser la commande sed suivante:

Si la ligne a ajouter est la suivante:
192.168.0.100 poste0

Et si la ligne connue en dessous de laquelle tu souhaites ajouter la nouvelle ligne est la suivante:
192.168.0.1 poste2

Alors il faut utiliser la commande sed suivante:
sed -e '/192.168.0.1 poste2/a\192.168.0.100 poste0/' nom_fichier.txt

Pour avoir plus d'informations sur la commande sed vous pouvez visiter le blog suivant:
http://man2linux.blogspot.com/2010/11/sed.html