Sed

De Justine's wiki
Version datée du 22 juin 2022 à 11:48 par Justine (discussion | contributions)
(diff) ← Version précédente | Voir la version actuelle (diff) | Version suivante → (diff)
Aller à la navigation Aller à la recherche

http://sdz.tdct.org/sdz/la-commande-sed.html

Sed : un éditeur de texte en mode flux

Sed sert à modifier du texte : il prend un flux en entrée, lui applique des trucs, et renvoie le flux modifié en sortie. Il fonctionne en mémoire et est du coup puissant sur les gros fichiers.

On peut l'utiliser de deux façons :

  • La façon classique
  • Ou directement sur le fichier avec l'argument -i.

Du coup, le principe est simple :

sed [OPTION]... {script-only-if-no-other-script} [input-file]...

Sed prend un flux d'entrée et un script; le script peut être soit dans la commande (avec -e), les commandes séparées par des points-virgule; ou alors on charge le tout depuis un fichier.

Je pars ici du fichier suivant :

Bonjour,

Ceci est un fichier de test.
Ici la ligne numéro 4.

# ceci pourrait être un commentaire
Ici la ligne numéro 7.

Au revoir

Affichage

Par défaut, sed affiche son entrée en sortie :

<syntaxhighlight lang='bash'>

[justine@argonaut sed]$ sed test.txt Bonjour,

Ceci est un fichier de test. Ici la ligne numéro 4.

  1. ceci pourrait être un commentaire

Ici la ligne numéro 7.

Au revoir

</syntaxhighlight>

Adressage par ligne

<syntaxhighlight lang='bash'> [justine@argonaut sed]$ sed -e '4d; 7d' test.txt Bonjour,

Ceci est un fichier de test.

  1. ceci pourrait être un commentaire

Au revoir </syntaxhighlight>

  • -e : on utilise plusieurs commandes
  • d : delete

On efface tout entre les ligne 4 et 7.

Addressage par motif

<syntaxhighlight lang='bash'> [justine@argonaut sed]$ sed '/^#/ d' test.txt Bonjour,

Ceci est un fichier de test. Ici la ligne numéro 4.

Ici la ligne numéro 7.

Au revoir

</syntaxhighlight>

Même principe avec des regex. On peut aussi avoir des intervalles :

<syntaxhighlight lang='bash'> sed '/^Bonjour/,/^Au revoir/ d' test.txt </syntaxhighlight>

Ici on supprime tout entre bonjour et au revoir (donc tout...). On peut avoir un intervalle valide plusieurs fois, du coup il se répètera; on peut aussi avoir des choses comme ça :

sed '/^#/,7 d' test.txt

Mode silencieux

Le mode silencieux permet de n'afficher que les lignes qui matchent et que l'on demande à imprimer avec p:

<syntaxhighlight lang='bash'> [justine@argonaut sed]$ sed -n '/Ici/p' test.txt Ici la ligne numéro 4. Ici la ligne numéro 7.

</syntaxhighlight>

Substitution

sed permet de remplacer du texte avec des regex. On peut utiliser la syntaxe habituelle, ou la syntaxe étendue avec sed -r. La substitution s'écrit comme ceci : s/motif/substitut/ Par défaut, elle s'effectue sur la première occurrence du motif, sauf si on lui ajoute l'option g (pour global) comme ceci : s/motif/substitut/g On peut aussi choisir l'occurrence voulue, avec par exemple s/motif/substitut/2 pour la deuxième occurrence.

Quelques exemples :

sed -re 's/^# *//' fichier 

Décommente les lignes commentées (commençant par une dièse), et supprime les espaces en début de ligne (le * est un métacaractère signifiant 0 ou plus).

sed -re 's/ /    /g' fichier 

Remplace les tabulations par 4 espaces.


Translittération

La translittération permet d'échanger certains caractères avec d'autres caractères.

On l'écrit comme ceci : y/liste1/liste2/.

<syntaxhighlight lang='bash'> [justine@argonaut sed]$ sed -re 'y/éèê/eee/' test.txt Bonjour,

Ceci est un fichier de test. Ici la ligne numero 4.

  1. ceci pourrait etre un commentaire

Ici la ligne numero 7.

Au revoir

</syntaxhighlight>