<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<link REL="STYLESHEET" TYPE="text/css" TITLE="Style DILIB" HREF="../../dilib.css">
<style type="text/css">
.chaine { background-color: #B0E0FF; color: green; }
.chaine:before { content: "«"; }
.chaine:after { content: "»"; }
.attention { font-style: italic; }
.remarque, .exemple, .remarque_suite { font-size: small; }
.remarque { margin-bottom: 2; }
.remarque_suite { margin-bottom: 2; margin-top: 0; }
.remarque:before { content: "REMARQUE :"; }
.exemple:before { content: "Exemple : "; }
.attention:before { content: "ATTENTION :"; }
</style>
<title>sed - UNIX</title>
<link rel="copyright" href="http://www.inist.fr/"><link rel="author" href="http://dilib.inist.fr/membres.html"><link rel="chapter" href="caracteristiques.fre.html" title="UNIX"><link rel="chapter" href="X.fre.html" title="X Window"><link rel="chapter" href="redirPipes.fre.html" title="Rappels"><link rel="chapter" href="newCommandsUser.fre.html" title="Commandes UNIX"><link rel="chapter" href="shellVars.fre.html" title="Shell"><link rel="chapter" href="sed.fre.html" title="Sed"><link rel="chapter" href="make.fre.html" title="Make"><link rel="index" href="http://dilib.inist.fr/dilib/v04Main/IndexSite/Server/FR.resource.index.html"><link rel="top" title="Accueil de DILIB" href="http://dilib.inist.fr/dilib/v04Main/"><link rel="alternate" title="English version" href="sed.eng.html"><link rel="up" href="index.fre.html" title="Tutorial UNIX / Shell">
<link rel="section" href="sed.fre.html" title="Sed"><link rel="section" href="tpSed.fre.html" title="Travaux Pratiques">
<link rel="first" href="caracteristiques.fre.html" title="Caractéristiques d'UNIX">
<link rel="previous" href="tpShell.fre.html" title="Travaux Pratiques">
<link rel="next" href="tpSed.fre.html" title="Travaux Pratiques">
<link rel="last" href="tpSed.fre.html" title="Travaux Pratiques">
</head>
<body>
<h1>sed - UNIX</h1>
<div id="navcontainer">
<ul id="navlist">
<li><a href="caracteristiques.fre.html">UNIX</a>
</li>
<li><a href="redirPipes.fre.html">Bases</a>
</li>
<li><a href="newCommandsUser.fre.html">Commandes</a>
</li>
<li><a href="shellVars.fre.html">Shell</a>
</li>
<li><a>Sed</a>
<ul id="subnavlist">
<li><a href="sed.fre.html" id="subcurrent">Principes</a></li>
<li><a href="tpSed.fre.html">TP</a></li>
</ul>
</li>
<li><a href="make.fre.html">Make</a>
</li>
</ul>
</div>
<div class="content">
<p>
Sed (pour <strong>S</strong>tream <strong>ED</strong>itor) est
un éditeur non interactif de texte. Il permet d'appliquer une
certain nombre de commandes à un fichier puis d'en afficher le
résultat (sans modifier le fichier de départ) sur la sortie
standard. Comme avec toute commande unix, il est possible de rediriger
la sortie vers un fichier résultat.
</p>
<h2>Substitution</h2>
<p>
La commande suivante lit un fichier <code>file.txt</code> et affiche ses
lignes sur la sortie standard en remplaçant la chaîne
<span class="chaine">Dilib</span> par la chaîne
<span class="chaine">DILIB</span>.
</p>
<pre>sed 's/Dilib/DILIB/' file.txt</pre>
<p>
Il est conseillé d'entourer les commandes par des apostrophes
simples, pour éviter que le shell n'interprète les
<a href="paramShell.fre.html#speciaux">caractères spéciaux</a>
(<code>.*[]^$\</code>).
</p>
<p class="attention">
cette commande ne remplace que la première occurrence de
<span class="chaine">Dilib</span> sur chaque ligne du
fichier. S'il y en a deux, la deuxième ne sera pas
remplacée, à moins d'utiliser l'option
<code>g</code> en fin de commande :
</p>
<pre>sed 's/Dilib/DILIB/<strong>g</strong>' file.txt</pre>
<p>
Si on veut faire deux remplacements sur la même ligne de
commandes, on peut utiliser :
</p>
<pre>sed -e 's/Dilib/DILIB/g' <strong>-e</strong> 's/Jacques Ducloy/Monsieur Dilib/g' file.txt</pre>
<p class="attention">
le <code>-e</code> est obligatoire pour distinguer la deuxième
commande d'un nom de fichier qui n'en est jamais précédée.
</p>
<p class="remarque">
les commandes sont effectuées sur chaque ligne dans leur ordre
d'apparition, ce qui veut dire que <span class="chaine">Jacques
Ducloy</span> sera transformé en <span class="chaine">Monsieur
Dilib</span> <em>après</em> la substitution de
<span class="chaine">Dilib</span> par
<span class="chaine">DILIB</span>, il restera donc des
<span class="chaine">Dilib</span> sur la sortie standard.
</p>
<h3>Rappel sur les expressions régulières</h3>
<table border="1" class="var">
<tbody>
<tr>
<th>^</th>
<td>début de ligne</td>
</tr>
<tr>
<th>$</th>
<td>fin de ligne</td>
</tr>
<tr>
<th>[]</th>
<td>
classe de caractères (exemples : <code>[A-Z]</code>
correspond à toutes les lettres majuscules)
</td>
</tr>
<tr>
<th>[^...]</th>
<td>
classe de caractères correspondant à
n'importe quels caractères <em>sauf</em> ceux qui
suivent le caractère <code>^</code><br>
<div class="exemple">
Exemple : <code>[^:]</code> correspond à
tous les caractères sauf le <code>:</code>.
</div>
</td>
</tr>
<tr>
<th>*</th>
<td>le caractère précédant
<code>*</code> répété de 0 à n
fois</td>
</tr>
<tr>
<th>+</th>
<td>le caractère précédant
<code>+</code> répété de 1 à n
fois</td>
</tr>
<tr>
<th>?</th>
<td>le caractère précédant
<code>?</code> présent de 0 à 1 fois</td>
</tr>
</tbody>
</table>
<h3>Expression régulières</h3>
<p>
On peut utiliser des <a>expressions régulières</a>
dans les chaînes à remplacer (donc, il faut
banaliser les caractères spéciaux dans cette
chaîne).
</p>
<pre>sed -e 's/Jacques D[uU][cC][lL][oO][yY]/Monsieur Dilib/g' fichier</pre>
<p class="remarque">
le caractère <code>*</code> englobe autant de
caractères qu'il peut, ce qui veut dire que </p>
<pre class="remarque_suite">sed 's/ré.*duction/réduction/g' fichier</pre>
<p class="remarque_suite">
transformera le fichier
</p>
<pre class="remarque_suite">do ré mi fa sol la si duction ah bon duction la suite</pre>
<p class="remarque_suite">
en
</p>
<pre class="remarque_suite">do réduction la suite</pre>
<p class="remarque_suite">
et non en
</p>
<pre class="remarque_suite">do réduction ah bon duction la suite</pre>
<h2>
Récupération
</h2>
<p>
Les opérateurs <code>\(</code> et <code>\)</code> sauvent
leur contenu et permettent leur récupération par
l'utilisation de <code>\1</code>, <code>\2</code>, etc.
</p>
<pre>sed -e 's/^\([A-Z][A-Za-z]*\), \([A-Z][A-Za-z]*\)/\2 \1/' fichier</pre>
<p>
Remplacera les <span class="chaine">Nom, Prénom</span> en
début de chaque ligne du fichier (quand il en trouve) par
<span class="chaine">Prénom Nom</span>.
</p>
<h2>
Fichier de commandes
</h2>
<p>
Si vous avez beaucoup de commandes, vous pouvez les rassembler
dans un fichier comme celui-là :
</p>
<pre><span class="comment"># Fichier "exemple.sed"
# Il ne peut y avoir de commentaires que dans un bloc au début du
# fichier.</span>
s/É/&Eacute;/g
s/À/&Agrave;/g
s/Ç/&Ccedil;/g
</pre>
<p>
Pour appeler ce fichier, il faut utiliser l'option
<code>-f</code> :
</p>
<pre>sed <strong>-f</strong> exemple.sed fichier</pre>
<p>
Une autre solution consiste à en faire un script
exécutable (à la manière d'un script
shell) :
</p>
<pre><span class="comment">#!/usr/bin/sed -f
# Table de transcodage de ISO-8859-1 vers HTML
# Fichier "exemple2.sed"</span>
s/É/&Eacute;/g
s/À/&Agrave;/g
s/Ç/&Ccedil;/g
</pre>
<p>
Mais il ne faut pas oublier de lui donner les droits en
exécution, pour pouvoir l'appeler ainsi :
</p>
<pre>chmod u+x exemple2.sed
./exemple2.sed fichier</pre>
<p class="attention">
Un fichier de commandes sed doit toujours se terminer par un
passage à la ligne, sinon la dernière commande
n'est pas prise en compte!
</p>
<p class="attention">
De la même manière, toutes les lignes à
traiter doivent finir par un retour à la ligne (en
particulier la dernière)!
</p>
<hr>
<h2>
Référence
</h2>
<ul>
<li><a href="http://www.shellunix.com/sed.html">http://www.shellunix.com/sed.html</a> La commande sed</li>
</ul>
</div>
<hr>
<address><a href="mailto:philippe.houdry@inist.fr">Philippe.Houdry@inist.fr</a></address>
</body>
</html>