Maîtriser la commande sed pour le traitement de texte sous Linux

Fonctionnement de l'éditeur de flux sed

L'utilitaire sed (Stream Editor) est un outil puissant de traietment de texte qui opère ligne par ligne. Son cycle de fonctionnement repose sur un espace mémoire temporaire appelé "Pattern Space". Pour chaque ligne lue en entrée, sed l'enregistre dans cet espace, applique les commandes spécifiées, puis envoie le résultat vers la sortie stendard avant de passer à la ligne suivante. Par défaut, le fichier source reste inchangé, à moins qu'une redirection ou une option spécifique ne soit utilisée.

Syntaxe et options principales

La structure de base d'une commande sed est la suivante :

sed [options] 'action' fichier

Voici les options les plus fréquemment utilisées :

  • -n : Mode silencieux. Désactive l'affichage automatique du flux d'entrée. Seules les lignes explicitement ciblées (souvent avec la commande p) seront affichées.
  • -e : Permet d'enchaîner plusieurs scripts ou actions d'édition dans une même commande.
  • -i : Modifie directement le fichier d'origine au lieu d'afficher le résultat à l'écran.
  • -r : Active le support des expressions régulières étendues.

Les actions courantes se définissent par une plage de lignes (optionnelle) suivie d'une fonction :

  • a : Ajoute du texte après la ligne spécifiée.
  • i : Insère du texte avant la ligne spécifiée.
  • d : Supprime les lignes sélectionnées.
  • p : Affiche le contenu (souvent couplé à -n).
  • s : Substitue une chaîne de caractères par une autre via une expression régulière.
  • c : Remplace une ou plusieurs lignes par un nouveau contenu.

Manipulation de lignes : Ajout et Suppression

Pour illustrer la suppression, supposons un fichier nommé serveur.log. Pour supprimer les lignes 2 à 4 lors de l'affichage :

cat -n serveur.log | sed '2,4d'

Pour supprimer uniquement la dernière ligne du flux :

sed '$d' serveur.log

L'ajout de contenu s'effectue avec a (après) ou i (avant). Par exemple, pour insérer un commentaire après la ligne 1 :

sed '1a # Début du bloc de configuration' config.sys

Pour ajouter plusieurs lignes d'un coup, on utilise le caractère de continuation \ :

sed '2a Ligne supplémentaire 1 \
Ligne supplémentaire 2' fichier.txt

Remplacement de contenu (Substitution)

La commande s est l'une des plus utilisées pour transformer des données précises. Sa syntaxe est s/ancien/nouveau/g, où g signifie un remplacement global sur la ligne.

Si nous voulons modifier une adresse IP dans un fichier de configuration :

sed 's/192.168.0.1/10.0.0.5/g' network.conf

Il est possible de cibler une recherche spécifique avant d'appliquer une transformation. Pour chercher les lignes contenant "ERROR" et remplacer "timeout" par "fatal" :

sed -n '/ERROR/{s/timeout/fatal/;p}' application.log

Extraction et filtrage de données

Grâce à l'option -n et la fonction p, sed peut agir comme un filtre pour extraire des segments spécifiques d'un fichier.

Pour extraire uniquement les lignes 10 à 15 d'un document :

sed -n '10,15p' document.txt

Pour afficher toutes les lignes contenant le mot "admin" dans le fichier des utilisateurs :

sed -n '/admin/p' /etc/passwd

Édition multiple et modification de fichiers

L'option -e permet d'appliquer plusieurs transformations en une seule passe. Par exemple, supprimer la première ligne et remplacer "test" par "prod" :

sed -e '1d' -e 's/test/prod/g' environnement.env

Pour appliquer les changements de manière permanente dans le fichier, l'option -i est indispensable. Elle est particulièrement utile pour les traitements automatisés sur des fichiers volumineux :

# Remplace tous les points en fin de ligne par des points d'exclamation
sed -i 's/\.$/\!/g' rapport.txt

# Ajoute une signature à la fin du fichier
sed -i '$a # Fin du rapport automatique' rapport.txt

Étiquettes: Linux bash sed shell-scripting regex

Publié le 10 juin à 22h23