Outils pour utilisateurs

Outils du site


Panneau latéral

linux:sed (lu 52790 fois)

Ceci est une ancienne révision du document !


sed

Description

sed est un outils très puissant permettant de transformer le texte du flux entrant.

Doc très détaillé :

Exemples

Remplacement / substitution

Prenons un fichier exemple

toto 1234 toto titi
tata 4321 toto tutu

Pour remplacer toto par koko on utilise le s pour substitution

sed -e 's/toto/koko/' fichier.txt
koko 1234 toto titi
tata 4321 koko tutu

On peut remarquer que seul la 1ère occurence est remplacé, pour remplacer toutes les occurences, on utilise l’option g à la fin de la commande

sed -e 's/toto/koko/g' fichier.txt
koko 1234 koko titi
tata 4321 koko tutu

Translittération

Pratique pour par exemple remplacer tous les e avec accent par un e sans accent.

sed -e 'y/éèêë/eeee/' fichier.txt

Ou pour crypter/décrypter

sed -e 'y/abcdefghijklmnopqrstuvwxyz/mnopqrstuvwxyzabcdefghijkl/' fichier.txt

Suppression

Pour supprimer toutes les lignes de commentaire qui commence par exemple par #, on utilise l’option d pour delete à la fin de la commande

sed -e '/^#/d' fichier.txt

A contrario, si nous voulons que les lignes qui commencent par un #, on ajoute un ! devans l’option d

sed -e '/^#/!d' fichier.txt

Exemple avec un fichier de conf qui comporte des lignes commentés avec un ; et qui comportent beaucoup de lignes vide.

sed -e '/^[#;]/d;/^$/d' /etc/samba/smb.conf

Avec les [ ] et spécifie que la ligne commente par un # ou un ;. Le ; suivant veut dire que nous lançons une autre commande, celle ci dit que nous cherchons une ligne vide. ^ indique le début de la ligne et $ la fin. /d on delete.

Expressions régulières

Prenons le cas de la commande df qui permet d’afficher l’espace disque de notre machine. Nous aimerions récupérer ces données pour les transmettre dans un format CSV avec des ; comme séparateur.

Nous devons travailler sur ce genre de donnée:

Sys. de fichiers      1K-blocs   Utilisé    Dispo. Uti% Monté sur
/dev/sda1             19222656   7174048  11072048  40% /
tmpfs                  4099408         0   4099408   0% /lib/init/rw
udev                   4094596       196   4094400   1% /dev
tmpfs                  4099408         0   4099408   0% /dev/shm

On va imaginer un découpage basic de la sorte

champ1 champ2 champ3 champ4 champ5 champ6

Un champ est zéro ou plusieurs n’importe quel caractère ce qui se traduit parun point suivi d’une étoile

.* .* .* .* .* .*

Comme on veut pouvoir récupérer ces champs, on va les mettre entre parenthèses mais pour que sed ne croit pas que l’on cherche des parenthèses, nous devons les échapper par un backslash

\(.*\) \(.*\) \(.*\) \(.*\) \(.*\) \(.*\)

Maintenant entre chaque champ nous avons un ou plusieurs espaces, ou pourrait écrire l’expression [:space:]+ mais sed ne reconnait pas le caractère + permettant de dire que l’on veut au moins de une occurrence à plusieurs. Il faudrait ruser en écrivant ceci [:space:][:space]*

Nous allons faire plus simple en lançant une première commande permettant de remplacer toutes les suites d’espaces par un seul espace sur toutes les occurrences rencontrées sur la ligne.

sed -e 's/[ ][ ]*/ /g'

On obtient au final la commande

df | sed -e 's/[ ][ ]*/ /g' -e 's/\(.*\) \(.*\) \(.*\) \(.*\) \(.*\) \(.*\)/\1;\2;\3;\4;\5;\6/'
linux/sed.1360925304.txt.gz · Dernière modification: 04-04-2013 22:05 (modification externe)