300 lines
13 KiB
HTML
300 lines
13 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<title>Sed Basics</title>
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<meta name="author" content="wxcafé">
|
|
<link rel="icon" type="image/png" href="//wxcafe.net/theme/img/favicon.ico">
|
|
<!-- Le styles -->
|
|
<link rel="stylesheet" href="//wxcafe.net/theme/css/extra.css" type="text/css" />
|
|
<link rel="stylesheet" href="//wxcafe.net/theme/css/bootstrap.css" type="text/css" />
|
|
<link href='http://fonts.googleapis.com/css?family=Oswald&subset=latin,latin-ext' rel='stylesheet' type='text/css'>
|
|
<script type="text/javascript">
|
|
/* <![CDATA[ */
|
|
(function() {
|
|
var s = document.createElement('script');
|
|
var t = document.getElementsByTagName('script')[0];
|
|
|
|
s.type = 'text/javascript';
|
|
s.async = true;
|
|
s.src = '//api.flattr.com/js/0.6/load.js?'+
|
|
'mode=auto&uid=wxcafe&button=compact&popout=0';
|
|
t.parentNode.insertBefore(s, t);
|
|
})();
|
|
/* ]]> */
|
|
</script> <!-- flattr button loader -->
|
|
<style type="text/css">
|
|
body {
|
|
padding-top: 60px;
|
|
padding-bottom: 40px;
|
|
}
|
|
.sidebar-nav {
|
|
padding: 9px 0;
|
|
}
|
|
.tag-1 {
|
|
font-size: 13pt;
|
|
}
|
|
.tag-2 {
|
|
font-size: 10pt;
|
|
}
|
|
.tag-2 {
|
|
font-size: 8pt;
|
|
}
|
|
.tag-4 {
|
|
font-size: 6pt;
|
|
}
|
|
</style>
|
|
<link href="//wxcafe.net/theme/css/bootstrap-responsive.css" rel="stylesheet">
|
|
<link href="//wxcafe.net/theme/css/font-awesome.css" rel="stylesheet">
|
|
<link href="//wxcafe.net/theme/css/pygments.css" rel="stylesheet">
|
|
<!-- Le fav and touch icons -->
|
|
<link rel="shortcut icon" href="//wxcafe.net/theme/images/favicon.ico">
|
|
|
|
<link href="//wxcafe.net/feeds/feed.rss.xml" type="application/atom+xml" rel="alternate" title="Wxcafé RSS Feed" />
|
|
|
|
</head>
|
|
|
|
<body>
|
|
|
|
<div class="navbar navbar-fixed-top">
|
|
<div class="navbar-inner">
|
|
<div class="container-fluid">
|
|
<a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
|
|
<span class="icon-bar"></span>
|
|
<span class="icon-bar"></span>
|
|
<span class="icon-bar"></span>
|
|
</a>
|
|
<a class="brand" href="//wxcafe.net/index.html">Wxcafé </a>
|
|
<div class="nav-collapse">
|
|
<ul class="nav">
|
|
<li><a href="//wxcafe.net/archives.html"><i class="icon-th-list"></i> Archives</a></li>
|
|
<li><a href="//wxcafe.net/pages/about/">A propos</a></li>
|
|
<li class="divider-vertical"></li>
|
|
<ul class="nav pull-right">
|
|
</ul>
|
|
</ul>
|
|
</div><!--/.nav-collapse -->
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="container-fluid">
|
|
<div class="row">
|
|
<div class="span9" id="content">
|
|
<section id="content">
|
|
<article>
|
|
<header>
|
|
<h1>
|
|
<a href=""
|
|
rel="bookmark"
|
|
title="Permalink to Sed Basics">Sed Basics</a>
|
|
</h1>
|
|
</header>
|
|
<div class="entry-content">
|
|
<div class="well">
|
|
<footer class="post-info">
|
|
<span class="label">Date</span>
|
|
<span class="published" title="2013-08-18T22:57:00+02:00">
|
|
<i class="icon-calendar"></i> Sun 18 August 2013
|
|
</span>
|
|
<br />
|
|
<span class="label">By</span>
|
|
<a href="//wxcafe.net/author/wxcafe.html"><i class="icon-user"></i>Wxcafe</a>
|
|
<br />
|
|
<span class="label">Category</span>
|
|
<a href="//wxcafe.net/category/tutoriel/"><i class="icon-folder-open"></i>Tutoriel</a>
|
|
<br />
|
|
|
|
|
|
|
|
|
|
</footer><!-- /.post-info --> </div>
|
|
<p><code>sed</code> est un outil Unix très largement utilisé et très pratique pour manipuler
|
|
le texte (ce qui se montre relativement indispensable dans un environnement
|
|
Unix, puisque ce système est assez porté sur le texte). Cependant, il assez peu
|
|
connu en détail, et la plupart du temps une seule fonction est utilisée : le
|
|
remplacement de texte.<br />
|
|
Or <code>sed</code> a bien plus de possibilités que ça, comme nous allons le voir.</p>
|
|
<p>Tout d’abord, rappelons les bases : <code>sed</code> est un programme Unix de base, mais
|
|
aussi un langage de manipulation de texte dérivé de <code>ed</code>, l’éditeur original.<code>ed</code> est un éditeur de ligne, conçu a l’époque ou les ordinateurs n’étaient pas
|
|
personnels et étaient utilisés avec des <a href="http://fr.wikipedia.org/wiki/telescripteur">téléscripteurs</a>, c’est a dire des
|
|
machines dépourvues d’écrans et ne permettant donc pas l’utilisation d’éditeurs
|
|
dits “visuels”, tels que vim, emacs, et globalement tous les éditeurs ayant un
|
|
curseur et affichant plusieurs lignes. <code>sed</code> est donc une évolution de <code>ed</code>, le
|
|
s signifiant stream, <code>sed</code> est un éditeur de flux, prenant donc avantage du
|
|
concept Unixien de flux de données (voir <a href="http://fr.wikipedia.org/wiki/Flux_standard">Flux standards</a>) pour éditer plus d’une ligne a la fois.
|
|
En pratique, <code>sed</code> est principalement utilisé sur des fichiers.</p>
|
|
<p><code>sed</code> a quelques options pratique, notamment <code>-s</code> qui permet d’empêcher
|
|
l’affichage systématique des lignes traitées, ou bien <code>-i</code> (pour GNU sed) qui
|
|
permet de rediriger l’output dans le fichier d’input. Cela dit, l’intérêt unique
|
|
du programme est son langage de manipulation de texte.</p>
|
|
<p><code>ed</code>, et donc <code>sed</code>, utilise un langage basé sur les séparations (en général des
|
|
/). Ainsi, la commande de base dans <code>sed</code> est </p>
|
|
<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">/[regex]/
|
|
</pre></div>
|
|
|
|
|
|
<p>qui permet de ne sélectionner que les lignes qui matchent [regex] (et donc de
|
|
n’exécuter les commandes qui suivent que sur ces lignes.) </p>
|
|
<p><br/>
|
|
La commande <code>sed</code> la plus utilisée est bien entendu le <strong>s</strong>, qui s’utilise de
|
|
la façon suivante : </p>
|
|
<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #f8f8f2">s</span><span style="color: #f92672">/</span><span style="color: #f8f8f2">[old</span> <span style="color: #f8f8f2">text]</span><span style="color: #f92672">/</span><span style="color: #f8f8f2">[new</span> <span style="color: #f8f8f2">text]</span><span style="color: #f92672">/</span><span style="color: #f8f8f2">[options]</span>
|
|
</pre></div>
|
|
|
|
|
|
<p>qui se propose donc de remplacer (substitute) [old text] (qui peut être une
|
|
regex) par [new text] (qui doit être un texte fixe, avec quelques
|
|
exceptions), en appliquant [options], la plus connue des options étant <code>g</code>,
|
|
qui permet d’appliquer la commande affectée a toutes les occurrences du texte
|
|
matché sur la/les lignes concernée-s.<br />
|
|
Les exceptions a la “fixité” de [new text] sont particulièrement
|
|
intéressantes. En effet, <code>sed</code> utilise un langage de regex plutôt standard,
|
|
excepté le fait qu’il permet jusqu’à 9 “holding spaces”, qui sont délimités par
|
|
\( et \), et qui sont représentées dans le texte de remplacement par \1 à
|
|
\9.</p>
|
|
<p>Par exemple, la commande </p>
|
|
<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">sed 's/\(hello world\) world/\1/'
|
|
</pre></div>
|
|
|
|
|
|
<p>sur le texte “hello world world” renverrait comme résultat</p>
|
|
<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">hello world
|
|
</pre></div>
|
|
|
|
|
|
<p>De la même façon, le symbole <code>&</code> dans le texte de remplacement représente le
|
|
texte original. Ainsi, la commande </p>
|
|
<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">sed 's/hello world/& world/'
|
|
</pre></div>
|
|
|
|
|
|
<p>sur le texte “hello world” renverrait comme résultat</p>
|
|
<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">hello world world
|
|
</pre></div>
|
|
|
|
|
|
<p><br/></p>
|
|
<p>Une autre commande utile est <strong>p</strong>, qui sert a afficher le texte présent dans
|
|
l’espace courant :</p>
|
|
<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">/[regex]/p
|
|
</pre></div>
|
|
|
|
|
|
<p><code>sed</code> stocke en effet la ligne sur laquelle il travaille dans un espace mémoire
|
|
dédié, que j’appelle l’espace courant (pattern space en anglais). La commande<code>p</code> affiche (print) ce qui ce trouve dans cet espace. La /[regex]/ réduit
|
|
le pattern space de façon a ce qu’il ne contienne que les lignes matchant, et le <strong>p</strong> affiche donc ce dernier.</p>
|
|
<p>Un autre exemple de commande sont <strong>c</strong>, <strong>i</strong> et <strong>a</strong>, qui s’utilisent ainsi :</p>
|
|
<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">c \
|
|
[text]
|
|
</pre></div>
|
|
|
|
|
|
<p>De la même façon, pour le i : </p>
|
|
<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">i \
|
|
[text]
|
|
</pre></div>
|
|
|
|
|
|
<p>Et de même pour a. </p>
|
|
<p>Ces trois commandes s’utilisent de la même façon pour la bonne raison qu’elles
|
|
sont très proches. <strong>i</strong> sert a insérer du texte <em>avant</em> le pattern space. <strong>a</strong>
|
|
sert a insérer du texte <em>après</em> le pattern space, et enfin <strong>c</strong> sert a
|
|
remplacer <em>tout</em> le pattern space. Les trois utilisent [text] comme
|
|
remplacement ou insert.
|
|
Attention, les insertions se font sur la ligne précédant ou suivant le pattern
|
|
space, et non sur la ligne en question.</p>
|
|
<p>Enfin, dernière commande ne fonctionnant que ligne par ligne, <strong>d</strong> :
|
|
/[regex]/d
|
|
<strong>d</strong> (delete) supprime les contenus du pattern space.</p>
|
|
<p><code>sed</code> est un outil puissant, mais complexe. Dans un prochain article, je
|
|
parlerai des commandes multilignes et des labels.</p>
|
|
</div><!-- /.entry-content -->
|
|
</article>
|
|
</section>
|
|
</div><!--/span-->
|
|
<div class="span3 well sidebar-nav" id="sidebar">
|
|
<ul class="nav nav-list">
|
|
|
|
|
|
<!-- Categories links -->
|
|
<li class="nav-header"><h4><i class="icon-folder-close icon-large"></i> Categories</h4></li>
|
|
<li>
|
|
<a href="//wxcafe.net/category/hacking/">
|
|
<i class="icon-folder-open icon-large"></i>Hacking
|
|
</a>
|
|
</li>
|
|
<li>
|
|
<a href="//wxcafe.net/category/note/">
|
|
<i class="icon-folder-open icon-large"></i>Note
|
|
</a>
|
|
</li>
|
|
<li>
|
|
<a href="//wxcafe.net/category/oses/">
|
|
<i class="icon-folder-open icon-large"></i>OSes
|
|
</a>
|
|
</li>
|
|
<li>
|
|
<a href="//wxcafe.net/category/ranting/">
|
|
<i class="icon-folder-open icon-large"></i>Ranting
|
|
</a>
|
|
</li>
|
|
<li>
|
|
<a href="//wxcafe.net/category/tutoriel/">
|
|
<i class="icon-folder-open icon-large"></i>Tutoriel
|
|
</a>
|
|
</li>
|
|
<li>
|
|
<a href="//wxcafe.net/category/vidya-games/">
|
|
<i class="icon-folder-open icon-large"></i>Vidya Games
|
|
</a>
|
|
</li>
|
|
<hr>
|
|
|
|
<!-- Social links -->
|
|
<li class="nav-header"><h4><i class="icon-exchange"></i> social</h4></li>
|
|
<a class="FlattrButton" style="display:none;"
|
|
title="//wxcafe.net"
|
|
style="padding-top: 10px;"
|
|
rel="flattr;
|
|
url://wxcafe.net;
|
|
title://wxcafe.net;
|
|
button:compact;
|
|
popout:0;
|
|
uid:wxcafe;
|
|
category:blog;"
|
|
href="//wxcafe.net">flattr</a>
|
|
<li><a href="https://twitter.com/wxcafe"><i class="icon-twitter icon-large"></i> Twitter</a></li>
|
|
<li><a href="https://github.com/wxcafe"><i class="icon-github icon-large"></i> Github</a></li>
|
|
<li><a href="mailto://wxcafe@wxcafe.net"><i class="icon-envelope icon-large"></i> Email</a></li>
|
|
<li><a href="https://pub.wxcafe.net/wxcafe.asc"><i class="icon-key icon-large"></i> Gpg</a></li>
|
|
<li><a href="https://www.openstreetmap.org/relation/105146"><i class="icon-map-marker icon-large"></i> IRL</a></li>
|
|
|
|
<hr>
|
|
|
|
<!-- Links -->
|
|
<li class="nav-header"><h4><i class="icon-external-link"></i> Links</h4></li>
|
|
<li><a href="https://github.com/wxcafe/blog-source"><i class="icon-code icon-large "></i> Source!</a></li>
|
|
<li><a href="http://git.wxcafe.net"><i class="icon-github-sign icon-large "></i> Public Git</a></li>
|
|
<hr>
|
|
|
|
<!--- RSS feed -->
|
|
<li class="nav-header"><h4><i class="icon-rss"></i> feeds</h4></li>
|
|
<li><a href="//wxcafe.net/feeds/feed.rss.xml" rel="alternate"><i class="icon-bookmark-empty icon-large"></i> RSS</a></li>
|
|
<li><a href="//wxcafe.net/feeds/feed.atom.xml" rel="alternate"><i class="icon-bookmark-empty icon-large"></i> Atom</a></li>
|
|
|
|
|
|
</ul> </div><!--/.well -->
|
|
</div><!--/row-->
|
|
<hr>
|
|
<footer>
|
|
<address id="about">
|
|
Proudly powered by <a href="http://pelican.notmyidea.org/">Pelican</a>,
|
|
which takes great advantage of <a href="http://python.org">Python</a>.<br />
|
|
Powered by <a href="https://github.com/getpelican/pelican-themes/tree/master/bootstrap2">bootstrap2</a> theme, thanks!
|
|
</address>
|
|
</footer>
|
|
</div><!--/.fluid-container-->
|
|
</body>
|
|
</html> |