Dans le monde UNIX, nous disposons de beaucoup d'options quand il s'agit d'éditer des fichiers. Il vous suffit de réfléchir, et vous verrez des noms comme vi, emacs, jed vous venir à l'esprit, mais ce ne sont que des exemples parmi d'autres. Nous avons tous un éditeur de texte favori (accompagné de raccourcis claviers adaptés à vos habitudes), que nous avons appris à utiliser et que nous aimons. Avec notre éditeur bien aimé nous pouvons réaliser n'importe quelles taches d'administration liées à la programmation ou à l'administration UNIX.
Si les éditeurs interactifs sont puissants, ils ont des l imitatons. Si leur nature interactive peut être une force, cela peut aussi se révéler être une faiblesse. Prenez par exemple une situation dans laquelle vous devez effectuer des modifications similaires sur un groupement de fichiers. Vous pouvez lancer instinctivement votre éditeur favori et réaliser une grosse quantité d'éditions de fichiers à la main, opération répétitive et longue s'il en est. Mais il existe un meilleur moyen.
Ce serait bien si nous pouvions automatiser le processus d'édition des fichiers, et ainsi pouvoir éditer en ligne de commande, voire même écrit des scripts qui permettent d'effectuer des modifications sophistiquées sur des fichiers existants. Heureusement pour nous, dans ce genre de situation, il existe une solution, et cette solution s'appelle sed.
sed est un éditeur de flux léger inclu dans presque tous les systèmes UNIX, notamment Linux. sed dispose de nombreuses fonctionnalités intéressantes. Tout d'abord, il est très léger, généralement plusieurs fois plus petit que votre éditeur préféré. Ensuite, comme sed est un éditeur de flux, ce qui lui permet d'éditer les données qu'il reçoit depuis l'entrée standard stdin, ou depuis un « pipe ». Vous n'avez donc pas besoin d'avoir les données sur un fichier sauvegardé sur disque pour pouvoir les éditer. Comme les données peuvent être traitées en ligne de commande il est très facile d'utiliser sed dans une longue ligne de commande d'un script Shell. Essayez donc d'en faire autant avec votre éditeur favori.
Heureusement pour nous autres utilisateurs de Linux, l'une des meilleures versions de sed existante se trouve être GNU sed, actuellement dans sa version 3.02. Toutes les distributions Linux ont GNU sed, ou du moins devraient. GNU sed est populaire non seulement parce que ses sources peuvent être distribuées librement, mais aussi parce qu'il dispose de nombreuses extensions efficaces et sympathiques vis à vis du standard POSIX. GNU sed ne souffre pas des nombreuses limitations que les récentes solutions propriétaires de sed ont, comme par exemple une limite à la longueur des lignes (GNU sed gère avec aisance les lignes de toute taille).
Lors de mes recherches pour écrire cet article j'ai remarqué que beaucoup de
fans de sed sur Internet faisaient référence à GNU sed 3.02a. Curieusement je
n'arrivais pas à trouver cette version sur
Dans cette série d'articles, nous utiliserons GNU sed 3.02.80. Quelques-uns (mais très peu) des exemples les plus avancés que vous trouverez plus loin dans ces articles ne fonctionnent pas avec GNU sed 3.02 ou 3.02a. Si vous utilisez une version de sed non GNU, le résultat peut varier. Pourquoi donc ne pas prendre le temps d'installer GNU sed 3.02.80 dès maintenant ? Vous serez alors non seulement prêt pour la suite des articles, mais vous pourrez également vous vanter d'avoir la meilleure version de sed qui existe !
Sed fonctionne en effectuant autant d'opérations d'éditions précisées par l'utilisateur que nécessaire (des « commandes ») en options à la commande. Sed est un programme en ligne de commande. Ainsi, les commandes sont effectuées ligne après ligne, dans l'ordre. Il écrit le résultat sur la sortie standard (stdout). Aucun fichier mis en entrée n'est modifié.
Jetons un œil à quelques exemples. Les quelques premiers exemples seront un peu étranges parce que je les utiliserai pour montrer comment fonctionne sed plus que pour effectuer une manipulation quelconque. Cela dit, si vous utilisez sed pour la première fois, il est très important que vous compreniez ces exemples. Voici le premier d'entre eux :
$ sed -e 'd' /etc/services
En tapant cette commande, vous n'obtiendrez absolument aucun message de sortie.
Bien, mais alors que se passe-t-il ? Dans cet exemple, nous exécutons sed
avec une commande d'édition,
Vous devez remarquer un certain nombre d'éléments dans cet exemple. Tout d'abord
La troisième chose à remarquer est l'utilisation des simples guillemets autour
de la commande
Voici un exemple d'utilisation de sed permettant de supprimer la première ligne
de
$ sed -e '1d' /etc/services | more
Comme vous pouvez le voir, cette commande ressemble vraiment à la première
commande
Maintenant jetons un oeil sur comment spécifier un rang d'adresse. Dans cet exemple, sed va supprimer les lignes de 1 à 10 dans la sortie :
$ sed -e '1,10d' /etc/services | more
Lorsque vous séparez deux adresses par une virgule, sed va appliquer la commande
suivante au rang d'adresse compris entre la première adresse et la seconde. Dans
cet exemple, la commande
Il est maintenant temps de montrer des exemples utiles. Disons que vous
souhaitez voir le contenu du fichier
$ sed -e '/^#/d' /etc/services | more
Essayez cet exemple et regardez ce qui se passe. Vous remarquerez que sed effectue sa tache avec brio. Essayons de comprendre ce qui s'est passé.
Pour comprendre la commande « /^#/d », nous devons tout d'abord la
disséquer. Laissons de côté le
Donc,
Nous pouvons utiliser les expressions régulières pour indioquer un modèle que
nous souhaiterions rencontrer dans un texte. Si vous avez déjà utilisé le
caractère
Caractère | Description |
---|---|
Le meilleur moyen de se faire la main avec les expressions régulières est de voir quelques exemples. Tous ces exemples seront des compatibles avec sed en tant qu'adresses pouvant être placées avant une commande. En voici quelques-un :
Expression régulière | Description |
---|---|
Je vous encourage d'essayer plusieurs de ces exemples. Prenez votre temps pour vous familiariser avec les expressions régulières, et pour essayer de nouvelles expressions régulières faites maison. Vous pouvez utiliser une expression régulière (ou regexp) de cette manière :
$ sed -e '/regexp/d' /chemin/d/acces/de/mon/fichier | more
Sed supprimera toutes les lignes respectant les règles de la regexp. Il est cependant plus facile de s'habituer à l'usage des expressions régulières en indiquant à sed d'afficher les regexp qui sont vérifiées, et de supprimer celles qui ne correspondent pas, plutôt que l'inverse. Cela peut se faire avec la commande suivante :
$ sed -n -e '/regexp/p' /chemin/d/acces/de/mon/fichier | more
Remarquez la nouvelle option
Jusqu'à maintenant nous avons jeté un oeil sur les adresses pour les lignes, les rangs d'adresses de lignes, et les adresses par expressions régulières. Mais il existe encore d'autres possibilités. On peut spécifier deux expressions régulières séparées par une virgule, et sed reconnaîtra toutes les lignes depuis la première ligne reconnue par la première expression régulière jusqu'à la première ligne (incluse) reconnue par la seconde expression régulière. Par exemple, la commande suivante affichera un bloc de texte commençant par une ligne contenant « BEGIN » et terminant par une ligne contenant « END » :
$ sed -n -e '/BEGIN/,/END/p' /mon/fichier/texte | more
Si le mot « BEGIN » n'a pas été trouvé, rien ne sera affiché. De plus si « BEGIN » a été trouvé, mais que « END » n'a pas été trouvé plus loin, toutes les lignes suivant le « BEGIN » seront affichées. Cela est dû au fait que sed est un éditeur de flux, et donc il ne peut pas deviner à l'avance si « END » sera ou non rencontré.
Si vous souhaitez n'afficher que la fonction main() d'un code source écrit en C, vous pouvez écrire :
$ sed -n -e '/main[[:space:]]*(/,/^}/p' fichiersource.c | more
Cette commande est composée de deux expressions régulières,
Dans ce cas particulier d'expression régulière, nous recontrons la classe de caractères « [[:space:]] ». Il s'agit d'un mot-clef spécial qui indique à sed de reconnaître soit une tabulation, soit un espace. Si vous le souhaitez, au lieu d'écrire « [[:space:]] » vous pouvez écrire « [ » suivi d'un espace littéral, puis un Ctrl-V, une tabulation littérale, et enfin un « ] » (la commande Ctrl-V indique à bash que vous souhaitez insérer une vraie tabulation plutôt qu'une complétion de commande). Il est cependant plus lisible d'utiliser la classe de caractères « [[:space:]] ».
Bon, passons maintenant à la seconde regexp.
La commande
Maintenant que nous avons vu les bases, nous sommes prêt à passer aux deux prochains articles. Si vous êtes avides de commandes sed, soyez patient, elles arrivent ! En attendant, vous pouvez jeter un oeil sur les ressources suivantes traitant de sed et des expressions régulières.