Aide-mémoire: commandes SED

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

 

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *