Stations de travail en ligne OnWorks Linux et Windows

Logo

Hébergement gratuit en ligne pour les postes de travail

<Précédent | Table des matières | Suivant>

sed

Le nom du blog sed est l'abréviation de éditeur de flux. Il exécute l'édition de texte sur un flux de texte, soit un ensemble de fichiers spécifiés, soit une entrée standard. sed est un programme puissant et quelque peu complexe (il existe des livres entiers à ce sujet), nous ne le couvrirons donc pas complètement ici.

En général, la façon sed fonctionne est qu'il reçoit soit une seule commande d'édition (sur la ligne de commande) soit le nom d'un fichier de script contenant plusieurs commandes, puis il exécute ces commandes sur chaque ligne du flux de texte. Voici un exemple très simple de sed en action:


[moi@linuxbox ~]$ echo "avant" | sed 's/avant/arrière/'

RETOUR

[moi@linuxbox ~]$ echo "avant" | sed 's/avant/arrière/'

RETOUR


Dans cet exemple, nous produisons un flux de texte d'un mot en utilisant echo et le redirigeons vers sed. sed, à son tour, exécute l'instruction s/avant/arrière/ sur le texte dans le flux et produit la sortie "retour" en conséquence. Nous pouvons également reconnaître cette commande comme ressemblant à la commande de « substitution » (rechercher et remplacer) dans vi.

Commandes dans sed commencer par une seule lettre. Dans l'exemple ci-dessus, la commande de substitution est représentée par la lettre s et est suivi par les chaînes de recherche et de remplacement, séparées par la barre oblique comme délimiteur. Le choix du caractère délimiteur est arbitraire. Par convention, le caractère barre oblique est souvent utilisé, mais sed acceptera tout caractère qui suit immédiatement la commande comme délimiteur. Nous pourrions exécuter la même commande de cette façon :



[moi@linuxbox ~]$ echo "avant" | sed 's_front_back_'

RETOUR

[moi@linuxbox ~]$ echo "avant" | sed 's_front_back_'

RETOUR


En utilisant le caractère de soulignement immédiatement après la commande, il devient le délimiteur. La possibilité de définir le délimiteur peut être utilisée pour rendre les commandes plus lisibles, comme nous le verrons.

La plupart des commandes dans sed peut être précédé d'un propos, qui spécifie quelle(s) ligne(s) du flux d'entrée seront éditées. Si l'adresse est omise, la commande d'édition est car-


ried sur chaque ligne dans le flux d'entrée. La forme d'adresse la plus simple est un numéro de ligne. Nous pouvons en ajouter un à notre exemple :



[moi@linuxbox ~]$ echo "avant" | sed '1s/avant/arrière/'

RETOUR

[moi@linuxbox ~]$ echo "avant" | sed '1s/avant/arrière/'

RETOUR


Ajout de l'adresse 1 à notre commande provoque l'exécution de notre substitution sur la première ligne de notre flux d'entrée d'une ligne. Si nous spécifions un autre numéro :



[moi@linuxbox ~]$ echo "avant" | sed '2s/avant/arrière/'

avant

[moi@linuxbox ~]$ echo "avant" | sed '2s/avant/arrière/'

avant


on voit que l'édition n'est pas effectuée, puisque notre flux d'entrée n'a pas de ligne 2. Les adresses peuvent être exprimées de plusieurs manières. Voici les plus courantes :

Tableau 20-7 : notation d'adresse sed


Description d'adresse

Description d'adresse

n Un numéro de ligne où n est un entier positif.


image

$ La dernière ligne.


image

/regexp/ Lignes correspondant à une expression régulière de base POSIX. Notez que l'expression régulière est délimitée par des barres obliques. Facultativement, l'expression régulière peut être délimitée par un caractère alternatif, en spécifiant l'expression avec \crégexpc, Où c est le caractère alternatif.


image

adresse1,adresse2 Une gamme de lignes de adresse1 à adresse2, inclus. Les adresses peuvent être n'importe laquelle des formes d'adresse unique ci-dessus.


image

premier~étape Faites correspondre la ligne représentée par le nombre premier, puis chaque ligne suivante à étape intervalles. Par exemple, 1~2 fait référence à chaque ligne impaire, 5~5 fait référence à la cinquième ligne et à chaque cinquième ligne par la suite.


image

adresse1,+n Match adresse1 et les suivants n lignes.


image

addr! Faire correspondre toutes les lignes sauf addr, qui peut être l'une des formes ci-dessus.


image


Nous allons montrer différents types d'adresses en utilisant le distributions.txt fichier antérieur


dans ce chapitre. Tout d'abord, une plage de numéros de ligne :


image

[moi@linuxbox ~]$ sed -n '1,5p' distributions.txt

SUSE 10.2 12/07/2006

Fedora 10 11/25/2008

SUSE 11.0 06/19/2008

Ubuntu 8.04 04/24/2008

Fedora 8 11/08/2007


Dans cet exemple, nous imprimons une plage de lignes, en commençant par la ligne 1 et en continuant jusqu'à la ligne 5. Pour ce faire, nous utilisons le p commande, qui provoque simplement l'impression d'une ligne correspondante. Cependant, pour que cela soit efficace, nous devons inclure l'option -n (l'option pas d'impression automatique) pour provoquer sed de ne pas imprimer chaque ligne par défaut.

Ensuite, nous allons essayer une expression régulière :



[moi@linuxbox ~]$

sed -n '/SUSE/p' distributions.txt

SUSE10.2

12/07/2006

SUSE11.0

06/19/2008

SUSE10.3

10/04/2007

SUSE10.1

05/11/2006


En incluant l'expression régulière délimitée par des barres obliques /SUSE/, nous sommes capables d'isoler les lignes qui le contiennent de la même manière que grep.

Enfin, nous allons essayer la négation en ajoutant un point d'exclamation (!) à l'adresse :


[moi@linuxbox ~]$

sed -n '/SUSE/!p' distros.txt

Fedora 10

11/25/2008

Ubuntu 8.04

04/24/2008

Fedora 8

11/08/2007

Ubuntu 6.10

10/26/2006

Fedora 7

05/31/2007

Ubuntu 7.10

10/18/2007

Ubuntu 7.04

04/19/2007

Fedora 6

10/24/2006

Fedora 9

05/13/2008

Ubuntu 6.06

06/01/2006

Ubuntu 8.10

10/30/2008

Fedora 5

03/20/2006


Ici, nous voyons le résultat attendu : toutes les lignes du fichier, à l'exception de celles correspondant au


expression régulière.

Jusqu'à présent, nous avons examiné deux des sed commandes d'édition, s et p. Voici une liste plus complète des commandes d'édition de base :


Tableau 20-8 : Commandes d'édition de base de sed


Description de la commande

Description de la commande

= Numéro de la ligne actuelle de sortie.


image

a Ajoute du texte après la ligne courante.


image

d Supprimer la ligne actuelle.


image

i Insérer du texte devant la ligne courante.


image

p Imprimer la ligne courante. Par défaut, sed imprime chaque ligne et modifie uniquement les lignes qui correspondent à une adresse spécifiée dans le fichier. Le comportement par défaut peut être remplacé en spécifiant l'option -n.


image

q Sortie sed sans traiter plus de lignes. Si la

L'option -n n'est pas spécifiée, affiche la ligne actuelle.


image

Q Sortie sed sans traiter plus de lignes.


image

s/regexp/remplacement/ Remplacez le contenu de remplacement partout où

regexp est trouvé. remplacement peut inclure le caractère spécial &, ce qui équivaut au texte correspondant à regexp. En outre, remplacement peut inclure les séquences \1 à travers \9, qui sont le contenu des sous-expressions correspondantes dans regexp. Pour en savoir plus à ce sujet, voir la discussion de retour références au dessous de. Après la barre oblique qui suit remplacement, un indicateur facultatif peut être spécifié pour modifier le s comportement de la commande.


image

y/set1/set2 Effectuez la translittération en convertissant les caractères de set1 aux caractères correspondants dans set2. Notez que contrairement à tr, sed exige que les deux ensembles soient de la même longueur.


image


Le s est de loin la commande d'édition la plus couramment utilisée. Nous allons démontrer une partie de sa puissance en effectuant un montage sur notre distributions.txt déposer. Nous avons discuté auparavant de la façon dont le champ de date dans distributions.txt n'était pas dans un format « convivial pour l'ordinateur »


tapis. Bien que la date soit au format MM/JJ/AAAA, il serait préférable (pour faciliter le tri) que le format soit AAAA-MM-JJ. Effectuer cette modification sur le fichier à la main serait à la fois chronophage et sujet aux erreurs, mais avec sed, ce changement peut être effectué en une seule étape :


image

[moi@linuxbox ~]$ sed 's/\([0-9]\{2\}\)\/\([0-9]\{2\}\)\/\([0-9]\{4\}\

)$/\3-\1-\2/' distributions.txt

SUSE 10.2 2006-12-07

Fedora 10 2008-11-25

SUSE 11.0 2008-06-19

Ubuntu 8.04 2008-04-24

Fedora 8 2007-11-08

SUSE 10.3 2007-10-04

Ubuntu 6.10 2006-10-26

Fedora 7 2007-05-31

Ubuntu 7.10 2007-10-18

Ubuntu 7.04 2007-04-19

SUSE 10.1 2006-05-11

Fedora 6 2006-10-24

Fedora 9 2008-05-13

Ubuntu 6.06 2006-06-01

Ubuntu 8.10 2008-10-30

Fedora 5 2006-03-20

Wow! Maintenant, c'est une commande qui a l'air laide. Mais ça marche. En une seule étape, nous avons modifié le format de la date dans notre fichier. C'est aussi un exemple parfait de la raison pour laquelle les expressions régulières sont parfois qualifiées en plaisantant de médium « en écriture seule ». Nous pouvons les écrire, mais parfois nous ne pouvons pas les lire. Avant que nous ne soyons tentés de fuir terrorisés par cette commande, regardons comment elle a été construite. Premièrement, nous savons que la commande aura cette structure de base :



sed 's/regexp/remplacement/' distributions.txt

sed 's/regexp/remplacement/' distributions.txt


Notre prochaine étape consiste à trouver une expression régulière qui isolera la date. Comme il est au format MM/JJ/AAAA et qu'il apparaît en fin de ligne, nous pouvons utiliser une expression comme celle-ci :



[0-9]{2}/[0-9]{2}/[0-9]{4}$

[0-9]{2}/[0-9]{2}/[0-9]{4}$


qui correspond à deux chiffres, une barre oblique, deux chiffres, une barre oblique, quatre chiffres et la fin de la ligne. Donc ça s'occupe de regexp, mais qu'en est-il remplacement? Pour gérer cela, nous devons introduire


une nouvelle fonctionnalité d'expression régulière qui apparaît dans certaines applications qui utilisent BRE. Cette fonctionnalité s'appelle retour références et fonctionne comme ceci : Si la séquence \n apparaît dans remplacement n est un nombre de 1 à 9, la séquence fera référence à la sous-expression correspondante dans l'expression régulière précédente. Pour créer les sous-expressions, nous les mettons simplement entre parenthèses comme ceci :



([0-9]{2})/([0-9]{2})/([0-9]{4})$

([0-9]{2})/([0-9]{2})/([0-9]{4})$


Nous avons maintenant trois sous-expressions. Le premier contient le mois, le second contient le jour du mois et le troisième contient l'année. On peut maintenant construire remplacement comme suit:



\3-\1-\2

\3-\1-\2


ce qui nous donne l'année, un tiret, le mois, un tiret et le jour. Maintenant, notre commande ressemble à ceci :


sed 's/([0-9]{2})/([0-9]{2})/([0-9]{4})$/\3-\1-\2/' distros.txt

sed 's/([0-9]{2})/([0-9]{2})/([0-9]{4})$/\3-\1-\2/' distros.txt


Nous avons deux problèmes restants. La première est que les barres obliques supplémentaires dans notre expression régulière confondront sed lorsqu'il essaie d'interpréter le s commander. La seconde est que depuis sed, par défaut, n'accepte que les expressions régulières de base, plusieurs des caractères de notre expression régulière seront considérés comme des littéraux plutôt que comme des métacaractères. Nous pouvons résoudre ces deux problèmes avec une application libérale de barres obliques inverses pour échapper aux caractères incriminés :



sed 's/\([0-9]\{2\}\)\/\([0-9]\{2\}\)\/\([0-9]\{4\}\)$/\3-\1-\2/' dis tros.txt

sed 's/\([0-9]\{2\}\)\/\([0-9]\{2\}\)\/\([0-9]\{4\}\)$/\3-\1-\2/' dis tros.txt


Et voila!

Une autre caractéristique du s La commande est l'utilisation d'indicateurs facultatifs qui peuvent suivre la chaîne de remplacement. Le plus important d'entre eux est le g drapeau, qui indique sed pour appliquer la recherche et le remplacement globalement à une ligne, pas seulement à la première instance, qui est la valeur par défaut. Voici un exemple:


[moi@linuxbox ~]$ echo "aaabbcccc" | sed 's/b/B/'

aaaBBcccc

[moi@linuxbox ~]$ echo "aaabbcccc" | sed 's/b/B/'

aaaBBcccc


Nous voyons que le remplacement a été effectué, mais uniquement à la première instance de la lettre « b », tandis que les instances restantes sont restées inchangées. En ajoutant le g flag, nous pouvons changer toutes les instances :



[moi@linuxbox ~]$ echo "aaabbcccc" | sed 's/b/B/g'

aaaBBBBccc

[moi@linuxbox ~]$ echo "aaabbcccc" | sed 's/b/B/g'

aaaBBBBccc


Jusqu'à présent, nous n'avons donné sed commandes simples via la ligne de commande. Il est également possible de construire des commandes plus complexes dans un fichier de script en utilisant le -f option. Pour démontrer, nous utiliserons sed avec notre distributions.txt fichier pour créer un rapport. Notre rapport comportera un titre en haut, nos dates modifiées et tous les noms de distribution convertis en majuscules. Pour ce faire, nous devrons écrire un script, nous allons donc lancer notre éditeur de texte et entrer ce qui suit :



# script sed pour produire un rapport sur les distributions Linux


1 je\

\

Rapport sur les distributions Linux\


s/\([0-9]\{2\}\)\/\([0-9]\{2\}\)\/\([0-9]\{4\}\)$/\3-\1-\2/ y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/

# script sed pour produire un rapport sur les distributions Linux


1 je\

\

Rapport sur les distributions Linux\


s/\([0-9]\{2\}\)\/\([0-9]\{2\}\)\/\([0-9]\{4\}\)$/\3-\1-\2/ y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/


Nous sauverons notre sed script comme distributions.sed et lancez-le comme ceci :


image

[moi@linuxbox ~]$ sed -f distributions.sed distributions.txt


Rapport sur les distributions Linux


SUSE

10.2

2006-12-07

FEUTRE

10

2008-11-25

SUSE

11.0

2008-06-19

UBUNTU

8.04

2008-04-24

FEUTRE

8

2007-11-08

SUSE

10.3

2007-10-04

UBUNTU

6.10

2006-10-26

FEUTRE

7

2007-05-31

UBUNTU

7.10

2007-10-18


UBUNTU

7.04

2007-04-19

SUSE

10.1

2006-05-11

FEUTRE

6

2006-10-24

FEUTRE

9

2008-05-13

UBUNTU

6.06

2006-06-01

UBUNTU

8.10

2008-10-30

FEUTRE

5

2006-03-20


# script sed pour produire un rapport sur les distributions Linux

# script sed pour produire un rapport sur les distributions Linux

Comme nous pouvons le voir, notre script produit les résultats souhaités, mais comment fait-il ? Jetons un autre regard sur notre script. nous utiliserons cat pour numéroter les lignes :



[moi@linuxbox ~]$ cat -n distributions.sed

[moi@linuxbox ~]$ cat -n distributions.sed


1

2

3

4

5

6

7

8

1

2

3

4

5

6

7

8


image

1 je\

\

Rapport sur les distributions Linux\


s/\([0-9]\{2\}\)\/\([0-9]\{2\}\)\/\([0-9]\{4\}\)$/\3-\1-\2/ y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/

1 je\

\

Rapport sur les distributions Linux\


s/\([0-9]\{2\}\)\/\([0-9]\{2\}\)\/\([0-9]\{4\}\)$/\3-\1-\2/ y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/

La première ligne de notre script est un commentaire. Comme de nombreux fichiers de configuration et langages de programmation sur les systèmes Linux, les commentaires commencent par le # caractère et sont suivis d'un texte lisible par l'homme. Les commentaires peuvent être placés n'importe où dans le script (mais pas dans les commandes elles-mêmes) et sont utiles à tous les humains qui pourraient avoir besoin d'identifier et/ou de maintenir le script.

La ligne 2 est une ligne vierge. Comme les commentaires, des lignes vierges peuvent être ajoutées pour améliorer la lisibilité.

Merci beaucoup sed les commandes prennent en charge les adresses de ligne. Ceux-ci sont utilisés pour spécifier sur quelles lignes de l'entrée il faut agir. Les adresses de ligne peuvent être exprimées sous forme de numéros de ligne simples, de plages de numéros de ligne et du numéro de ligne spécial « $ » qui indique la dernière ligne d'entrée.

Les lignes 3 à 6 contiennent du texte à insérer à l'adresse 1, la première ligne de l'entrée. Les i est suivie de la séquence backslash-carriage return pour produire un échappement de retour chariot, ou ce qu'on appelle un caractère de continuation de ligne. Cette séquence, qui peut être utilisée dans de nombreuses circonstances, y compris les scripts shell, permet d'intégrer un retour chariot dans un flux de texte sans signaler à l'interpréteur (dans ce cas sed) que la fin de la ligne est atteinte. Les i, et de même, le a (qui ajoute du texte au lieu de l'insérer) et c (qui remplace le texte), autorisent plusieurs lignes de texte tant que chaque ligne, à l'exception de la dernière, se termine par un caractère de continuation de ligne. La sixième ligne de notre script est en fait la fin de notre texte inséré et se termine par un simple retour chariot plutôt qu'un caractère de continuation de ligne, signalant la fin du i commander.


image

Remarque : un caractère de continuation de ligne est formé par une barre oblique inverse suivie immédiatement

par un retour chariot. Aucun espace intermédiaire n'est autorisé.


image

La ligne 7 est notre commande de recherche et de remplacement. Comme elle n'est pas précédée d'une adresse, chaque ligne du flux d'entrée est soumise à son action.

image

La ligne 8 effectue la translittération des lettres minuscules en lettres majuscules. Notez que contrairement tr, un y commande dans sed ne prend pas en charge les plages de caractères (par exemple, [a-z]), il ne prend pas non plus en charge les classes de caractères POSIX. Encore une fois, puisque le y La commande n'est pas précédée d'une adresse, elle s'applique à chaque ligne du flux d'entrée.


Les gens qui aiment sed aiment aussi...

sed est un programme très performant, capable d'effectuer des tâches d'édition assez complexes sur des flux de texte. Il est le plus souvent utilisé pour des tâches simples sur une ligne plutôt que pour de longs scripts. De nombreux utilisateurs préfèrent d'autres outils pour des tâches plus importantes. Les plus populaires d'entre eux sont awk et perl. Ceux-ci vont au-delà de simples outils comme les programmes couverts ici et s'étendent au domaine des langages de programmation complets. perl, en particulier, est souvent utilisé à la place des scripts shell pour de nombreuses tâches de gestion et d'administration du système, tout en étant un support très populaire pour le développement Web. awk est un peu plus spécialisé. Sa force spécifique est sa capacité à manipuler des données tabulaires. Cela ressemble à sed en ce sens que les programmes awk traitent normalement les fichiers texte ligne par ligne, en utilisant un schéma similaire au concept sed d'une adresse suivie d'une action. Bien qu'awk et perl sortent du cadre de ce livre, ce sont de très bonnes compétences à apprendre pour l'utilisateur de la ligne de commande Linux.


Meilleur système d'exploitation Cloud Computing chez OnWorks :