Linux Logiciels
Sed
Manipuler des chaines de caractères dans un fichier



Pour : Linux


SED permet d'appliquer un certain nombre de commandes sur un fichier, comme ajouter, supprimer, modifier, remplacer, ... avant ou après une chaine de caractère, en début ou en fin ligne, ... et bien plus encore. Puis d'en afficher le resultat avec ou sans modification du fichier de départ sur la sortie standard.

La syntaxe est la suivante: sed option "chaine et/ou fonction ou ..." fichier


1. Les options

Option -i permet d'écrire, de modifier directement dans le fichier de départ.

Option -n qui supprime la sortie standard par défaut, sed va écrire uniquement les lignes concernées par le traitement (sinon il écrit tout même les lignes non traitées).

Option -e n'est pas nécessaire quand vous avez une seule fonction d'édition.

Option -f les commandes sont lues à partir d'un fichier.




2. Les métacaractères

2.1 Les métacaractères "[ ]"

Les métacaractères [] permettent de désigner les caractères de l'expression régulière, compris dans un certain intervalle:

[5-7] Comprend l'intervalle de 5 à 7 donc 5, 6 et 7
Exemple: 4[5-7] permet d'avoir 45, 46, 47

[2-48] Comprend l'intervalle de 2 à 4 et 8 donc 2, 3, 4 et 8
Exemple: 7[2-48]7 permet d'avoir 727, 737, 747, 787

[7-9-] Comprend l'intervalle de 7 à 9 donc 7, 8 ,9 et -
Exemple: [7-9-]5 permet d'avoir 75, 85, 95, -5

[E-G] Comprend l'intervalle de E à G donc E, F, et G
Exemple: Avion[E-G] permet d'avoir AvionE, AvionF et AvionG

[E-Ge-g] Comprend l'intervalle de E à G et e à g donc E, F, G, e, f et g
Exemple: [E-Ge-g]toto permet d'avoir Etoto, etoto, Ftoto, ftoto, Gtoto et gtoto

On peut croiser les majuscules, minuscules et les chiffres, nombres
[4-6e] Comprend l'intervalle de 4 à 6 et e
Exemple: c[4-6e]7 permet d'avoir c47, c57, c67 et ce7

Vous pouvez choisir tout un intervalle comme:
[a-z], [A-Z], [0-9]

On peut aussi choisir l'opposé de l'expression régulière:
Le caractère juste après Voiture de doit pas être une minuscule donc Voiture[a-z]


2.2 Le métacaractère "*"

Le métacaractère * est le caractère qui permet de faire des répétitions.

e* correspond aux lignes qui comprennent 0 ou plusieurs caractère e.
Attention car ça permet d'avoir toutes les lignes qui contiennent ou pas des a, donc éviter d'utiliser cette commande.

ee* correspond aux lignes qui comprennent 1 ou plusieurs caractère e.

.* correspond à n'importe quelle chaîne de caractères.

[A-Z][A-Z]* va chercher les chaînes de caractères qui contiennent 1 ou plusieurs lettres majuscule.

[ ][ ]* correspond à tout sauf un blanc


2.3 Les métacaractères "\( \)"

Les sous-expressions
On encadre les sous chaînes dans les chaînes par des parenthèses pour un traitement complexe de fichier, pour cela on utilise la syntaxe \ (expression régulière)\, comme vous pouvez le voir les parenthèses doivent être elles-mêmes protégées par des antislash, à moins que l'option "-r" ait été employée.

Les références arrières
Cette sous chaîne sera identifié par un chiffre compris de 1 et 9 suivant l'ordre de définition, et on fera appel à ces sous chaîne avec \3 ou \6 ou ...

Exemple:
sed 's/\(chaine1)\(chaine2)\(chaine3)/\3 :\1 :\2/' fichier


2.4 Le métacaractère "$"

Le métacaractère $ identifie une fin de ligne.
L'expression régulière $ identifie une ligne vide

Exemple:
L'expression régulière T$ va identifier les lignes se terminant par le caractère T.
L'expression régulière TOTO$ va identifier les lignes qui contiennent la chaîne TOTO.


2.5 Le métacaractère "^"

Le métacaractère ^ identifie un début de ligne (juste avant le premier caractère).

Exemples:
Suppression la ou les lignes commençant par le mot "toto":
sed -i -e '/^toto/d' nom_fichier+extension


2.6 Le métacartère "\" (backslash)

Si l'on veut chercher une chaîne de caractère dans laquelle se trouve un caractère spécial comme "/, $, *, [, ], {, }, !, ." on doit pour cela le faire précéder par \ (backslash) pour faire en sorte que ce caractère ne soit pas interprété comme un caractère spécial ou metacaractère.

Exemples:
'\ /Home/cedric/' Un répertoire
'\ $cedric' Une variable


2.7 Le métacartère "."
Caractérise n'importe quel caractère, faut pas oublier que pour pouvoir caractériser le « . » dans une chaine, il faut le banaliser: "\."




3. Les fonctions

3.1 La fonction de substitution "s"

La fonction de substitution "s" permet de changer la première ou toutes les occurences d'une chaîne par une autre.
La syntaxe est la suivante:
sed "s/ancienne_chaine/nouvelle_chaine/option" fichier

Exemples:
sed "s/abc/123/" fichier => va changer uniquement la première chaîne "abc" trouvé dans le fichier en "123".
sed "s/abc/123/4" fichier => va changer uniquement la quatrième chaîne "abc" trouvé dans le fichier en "123".
sed "s/abc/123/g" fichier => va changer toutes les chaînes "abc" trouvé dans le fichier en "123".
sed "s/abc/123/p"" fichier => en cas de remplacement la ligne concernée est affichée sur la sortie standard.
sed "s/abc/123/w test" fichier => en cas de remplacement la ligne en entrée est écrite dans un fichier "test".


3.2 La fonction de suppression "d"

La fonction de suppression "d" supprime les lignes comprises dans un intervalle donné.
La syntaxe est la suivante:
sed "ancienne_chaine,nouvelle_chained"

Exemples:
sed "5,10d" fichier => Supprime les lignes 5 à 10 du fichier.
sed "/abc/d" fichier => Supprime toutes les lignes contenant la chaîne "abc".
sed "/123/!d" fichier => Supprime toutes les lignes ne contenant pas la chaîne "123".

En fait les lignes du fichier d'entrée ne sont pas supprimées, elles le sont au niveau de la sortie standard.


3.3 Les fonctions pour ajouter "a" et "i"

La fonction a (append) va placer un texte après la ligne sélectionnée.
La syntaxe est la suivante:
a\ chaine

La fonction i (insert) va placer un texte avant la ligne sélectionnée.
La syntaxe est la suivante:
i\ chaine

Exemples:
Ajouter sur une nouvelle ligne avec le mot "coulé" juste sous une ligne contenant le mot "bateau":
sed -i '/bateau/ a\coulé' nom_fichier+extension

Résultat dans mon fichier test:
C'est un grand bateau le paquebot.
coulé




4. La négation

La fonction sera appliquée à toutes les lignes qui ne correspondent pas à la caractérisation.

On va afficher toutes les comptes utilisateur sauf la 1ère ligne:
sed -n '1!p' /etc/passwd

Alors que sans le point d'exclamation on va afficher que la 1ère ligne:
sed -n '1p' /etc/passwd

On voit parfois cela "$!" ce qui permet d'effectuer une ou plusieurs commandes tant que la dernière ligne n'est pas atteinte et tant que cette condition est vraie.


Voir exemples:
Sed des exemples de manipulations



Par O.Cédric
Sur www.octetmalin.net

Article publié le:
23/06/2011 18:55






Cette page vous à plus?

Dîtes que vous l'aimez en cliquant sur le bouton Facebook.