Newer
Older
cours-unix-shell / UnixShell_cours2018 / sed.fre.html
<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&eacute;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 &eacute;diteur non interactif de texte. Il permet d'appliquer une
      certain nombre de commandes &agrave; un fichier puis d'en afficher le
      r&eacute;sultat (sans modifier le fichier de d&eacute;part) sur la sortie
      standard. Comme avec toute commande unix, il est possible de rediriger
      la sortie vers un fichier r&eacute;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&ccedil;ant la cha&icirc;ne 
      <span class="chaine">Dilib</span> par la cha&icirc;ne 
      <span class="chaine">DILIB</span>.
    </p>
    <pre>sed 's/Dilib/DILIB/' file.txt</pre>
    <p>
      Il est conseill&eacute; d'entourer les commandes par des apostrophes
      simples, pour &eacute;viter que le shell n'interpr&egrave;te les 
      <a href="paramShell.fre.html#speciaux">caract&egrave;res sp&eacute;ciaux</a>
      (<code>.*[]^$\</code>).
    </p>
    <p class="attention">
      cette commande ne remplace que la premi&egrave;re occurrence de
      <span class="chaine">Dilib</span> sur chaque ligne du
      fichier. S'il y en a deux, la deuxi&egrave;me ne sera pas
      remplac&eacute;e, &agrave; moins d'utiliser l'option
      <code>g</code> en fin de commande&nbsp;:
    </p>
    <pre>sed 's/Dilib/DILIB/<strong>g</strong>' file.txt</pre>
    <p>
      Si on veut faire deux remplacements sur la m&ecirc;me ligne de
      commandes, on peut utiliser&nbsp;:
    </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&egrave;me
      commande d'un nom de fichier qui n'en est jamais pr&eacute;c&eacute;d&eacute;e.
    </p>
    <p class="remarque">
      les commandes sont effectu&eacute;es sur chaque ligne dans leur ordre
      d'apparition, ce qui veut dire que <span class="chaine">Jacques
      Ducloy</span> sera transform&eacute; en <span class="chaine">Monsieur
      Dilib</span> <em>apr&egrave;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&eacute;guli&egrave;res</h3>
    <table border="1" class="var">
      <tbody>
	<tr>
	  <th>^</th>
	  <td>d&eacute;but de ligne</td>
	</tr>

	<tr>
	  <th>$</th>
	  <td>fin de ligne</td>
	</tr>

	<tr>
	  <th>[]</th>
	  <td>
	    classe de caract&egrave;res (exemples&nbsp;: <code>[A-Z]</code>
	    correspond &agrave; toutes les lettres majuscules)
	  </td>
	</tr>

	<tr>
	  <th>[^...]</th>
	  <td>
	    classe de caract&egrave;res correspondant &agrave;
	    n'importe quels caract&egrave;res <em>sauf</em> ceux qui
	    suivent le caract&egrave;re <code>^</code><br>

	    <div class="exemple">
	      Exemple&nbsp;: <code>[^:]</code> correspond &agrave;
	      tous les caract&egrave;res sauf le <code>:</code>.
	    </div>
	  </td>
	</tr>

	<tr>
	  <th>*</th>
	  <td>le caract&egrave;re pr&eacute;c&eacute;dant
	  <code>*</code> r&eacute;p&eacute;t&eacute; de 0 &agrave; n
	  fois</td>
	</tr>

	<tr>
	  <th>+</th>
	  <td>le caract&egrave;re pr&eacute;c&eacute;dant
	  <code>+</code> r&eacute;p&eacute;t&eacute; de 1 &agrave; n
	  fois</td>
	</tr>

	<tr>
	  <th>?</th>
	  <td>le caract&egrave;re pr&eacute;c&eacute;dant
	  <code>?</code> présent de 0 &agrave; 1 fois</td>
	</tr>
      </tbody>
    </table>
    <h3>Expression r&eacute;guli&egrave;res</h3>
    <p>
      On peut utiliser des <a>expressions r&eacute;guli&egrave;res</a>
      dans les cha&icirc;nes &agrave; remplacer (donc, il faut
      banaliser les caract&egrave;res sp&eacute;ciaux dans cette
      cha&icirc;ne).
    </p>
    <pre>sed -e 's/Jacques D[uU][cC][lL][oO][yY]/Monsieur Dilib/g' fichier</pre>
    <p class="remarque">
      le caract&egrave;re <code>*</code> englobe autant de
      caract&egrave;res qu'il peut, ce qui veut dire que </p>
    <pre class="remarque_suite">sed 's/r&eacute;.*duction/r&eacute;duction/g' fichier</pre>
    <p class="remarque_suite">
      transformera le fichier
    </p>
    <pre class="remarque_suite">do r&eacute; mi fa sol la si duction ah bon duction la suite</pre>
    <p class="remarque_suite">
      en
    </p>
    <pre class="remarque_suite">do r&eacute;duction la suite</pre>
    <p class="remarque_suite">
      et non en
    </p>
    <pre class="remarque_suite">do r&eacute;duction ah bon duction la suite</pre>
    
    <h2>
      R&eacute;cup&eacute;ration
    </h2>
    <p>
      Les op&eacute;rateurs <code>\(</code> et <code>\)</code> sauvent
      leur contenu et permettent leur r&eacute;cup&eacute;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&eacute;nom</span> en
      d&eacute;but de chaque ligne du fichier (quand il en trouve) par
      <span class="chaine">Pr&eacute;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&agrave;&nbsp;:
    </p>
    <pre><span class="comment"># Fichier "exemple.sed"
# Il ne peut y avoir de commentaires que dans un bloc au d&eacute;but du
# fichier.</span>
s/&Eacute;/&amp;Eacute;/g
s/&Agrave;/&amp;Agrave;/g
s/&Ccedil;/&amp;Ccedil;/g
</pre>
    <p>
      Pour appeler ce fichier, il faut utiliser l'option
      <code>-f</code>&nbsp;:
    </p>
    <pre>sed <strong>-f</strong> exemple.sed fichier</pre>
    <p>
      Une autre solution consiste &agrave; en faire un script
      ex&eacute;cutable (&agrave; la mani&egrave;re d'un script
      shell)&nbsp;:
    </p>
    <pre><span class="comment">#!/usr/bin/sed -f
# Table de transcodage de ISO-8859-1 vers HTML
# Fichier "exemple2.sed"</span>
s/&Eacute;/&amp;Eacute;/g
s/&Agrave;/&amp;Agrave;/g
s/&Ccedil;/&amp;Ccedil;/g
</pre>
    <p>
      Mais il ne faut pas oublier de lui donner les droits en
      ex&eacute;cution, pour pouvoir l'appeler ainsi&nbsp;:
    </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 &agrave; la ligne, sinon la derni&egrave;re commande
      n'est pas prise en compte!
    </p>
    <p class="attention">
      De la m&ecirc;me mani&egrave;re, toutes les lignes &agrave;
      traiter doivent finir par un retour &agrave; la ligne (en
      particulier la derni&egrave;re)!
    </p>
    <hr>
    <h2>
      R&eacute;f&eacute;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>