sed est un éditeur de texte conçu pour automatiser les opérations d’édition des fichiers de texte. Il est principalement utilisé dans des scripts et, par conséquent, il est surtout utilisé par les programmeurs. Il ne faudrait donc pas se surprendre qu’il ne soit ni interactif ni convivial. Les scripts SED sont très performants mais ils deviennent rapidement difficiles à lire. S’ils deviennent trop complexes, il faudrait penser à utiliser un autre outil (AWK, Python, etc). Néanmoins, on le retrouve partout. Parce qu’il est fiable et efficace, il est utilisé partout où les besoins d’édition de texte sont simples mais dépassent les capacités de bash. Il est installé, par défaut, par chacune des distributions.
sed est souvent utilisé avec 1 ou 2 redirections. Si besoin est, vous pouvez rafraichir vos connaissance ici.
Ligne de commande
Parce qu’il n’est pas interactif, les commandes d’édition sont spécifiées sur la ligne de commande ou dans un fichier. Les formes générales de la commande sont:
- sed [options] commande fichierTexte
- sed [options] -f fichierCommandes fichierTexte
où commande est une commande d’édition (généralement délimitée par des apostrophes ou guillemets). S’il y a plus d’une commande d’édition, on utilise -e pour chacune des commandes supplémentaires. Le fichier d’entrée est le second paramètre ou une redirection d’entrée. La sortie est le canal 2 (stdout) ou une redirection.
Les options peuvent être:
-e : utiliser un -e pour chaque commande supplémentaire -f : fichier de commandes-i : envoyer le résultat dans le fichier d'entrée
Trois exemples indépendants:
sed '2d' fichierTexte # effacer la 2ìème ligne du texte monProg | sed '2d' > fichierSortie sed -f fichierCommandes fichierTexte > fichierSortie
Syntaxe d’une commande
condition-de-sélection [!] opération [arguments]
où condition-de-sélection peut être:
la commande s’applique à toutes les lignes | |
n | la commande s’applique à la ligne n seulement. |
n,m | la commande s’applique aux lignes n à m (inclusivement). Ce type de sélection n’est pas possibles pour les commandes a, i, r, q et = |
/exprReg/ | la commande s’applique à chacune des lignes où l’expression régulière est vraie |
/expr1/, /expr2/ | la commande s’applique à chacune des lignes des blocs débutant par expr1 et se terminant par expr2 |
$ peut être utilisé pour spécifier la dernière ligne.
si la condition est suivie d’un !, alors la commande ne s’appliquera qu’aux lignes où la condition-de-sélection est fausse.
et l’opération (et ses arguments) peut être:
cmd | description | options | exemples |
---|---|---|---|
a | insérer ligne vide sous le curseur | 1a | |
d | éliminer la ligne du curseur | 1d | |
i | insérer ligne vide au-dessus du curseur | 1,3i | |
s | remplacer | g: répéter n: nième fois |
s/A/B/ s/A/B/g s/A/B/2 |
y/// | conversion de caractères (un pour un) | y/ab/AB/ | |
= | afficher numéro de la ligne | /proc/= | |
{ … … } |
grouper plusieurs commandes | 1,3{s/A/B/ s/C/D/} |
Exemple
Vous décidez de combiner deux sites WEB pour n’en faire qu’un seul. Le 1er site utilisait <H2> pour les titres de pages alors que le second utilisait <H3>. Pour uniformiser, vous voulez convertir à <H3> tous les <H2> de toutes les pages du 1er site.
for F in *htm do sed -i -e 's/<H2/<H3/g' $F done
Évidemment, cet exemple ignore le fait qu’il y a aussi des </H qui doivent être convertis. L’oblique étant utilisée comme séparateur par défaut par la commande s, il faudra donc complexifier un peu:
for F in *htm do sed -i -e 's/<\/H2/<\/H3/g' $F done
Le symbole \ indique à sed que le prochain caractère perd sa signification particulière. Une telle syntaxe peut devenir difficile à lire et il est plus simple de demander à sed de changer son délimiteur (le 1er caractère qui suit la commande s devient le délimiteur).
for F in *htm do sed -i -e 's|</H2|</H3|g' $F done
La solution finale, avec un peu d’embellissement, devient:
for F in *htm; do sed -i \ -e 's|<H2|<H3|g' \ -e 's|</H2|</H3|g' \ -e 's|<h2|<h3|g' \ -e 's|</h2|</h3|g' \ $F done