• Aucun résultat trouvé

Formulation des requˆ etes

15.3.1 Introduction

La forme g´en´erale d’une requ^ete est : [adresse1],[adresse2]commande[argument]

Les adresses sp´ecifi´ees dans une requ^etes d´esignent les limites (d´ebut et fin) o`u doit s’appliquer la commande. L’argument repr´esente une cha^ıne de caract`eres, ou du texte ou bien encore un fichier suivant les commandes utilis´ees.

15.3.2 D´ efinition des adresses

Les adresses peuvent ^etre d´ecrites de deux fa¸cons :

{ soit par des valeurs num´eriques donnant les num´eros de lignes de l’espace de travail ou le caract`ere "$" indiquant sa derni`ere ligne,

{ soit par des expressions r´eguli`eres plac´ees entre deux slash "/".

Une requ^ete pr´ec´ed´ee par deux adresses s’applique `a toutes les lignes comprises entre ces deux adresses. Dans le cas o`u deux adresses seraient identiques, il suffit de la sp´ecifier seulement une fois. Si aucune adresse n’est sp´ecifi´ee, l’espace de travail correspond `a la totalit´e des lignes en entr´ee. La commande "sed" est donc appliqu´ee `a toutes les lignes.

15.3. Formulation des requˆetes Syntaxes :

Adresse1,Adresse2Commande

Adresse1,/Expressioneguli`ere/Commande /Expressioneguli`ere/,Adresse2Commande

/Expression1eguli`ere/,/Expression2eguli`ere/Commande AdresseCommande

/Expressioneguli`ere/Commande Commande

Exemple 15.2 :

On utilise ici, `a titre d’exemple pour les adresses, la commande "d", permettant de d´etruire les lignes correspondantes de l’espace de travail.

10,20d D´etruit les lignes comprises entre la dixi`eme et la vingti`eme ligne . /^#/,$d D´etruit les lignes comprises entre la

premi`ere ligne commen¸cant par "#" jusqu’`a la derni`ere ligne du fichier (num´ero de ligne "$").

/^#/,/end$/d D´etruit les lignes comprises entre la premi`ere ligne commen¸cant par "#" et la premi`ere ligne se terminant par "end".

10d D´etruit la dixi`eme ligne.

/10/d D´etruit toute ligne contenant la cha^ıne

"10".

d D´etruit l’ensemble de l’espace de travail.

15.3.3 Les Commandes

La liste des commandes cit´ees dans ce paragraphe font parties des

plus utilis´ees. Cette liste n’est pas exhaustive. Pour plus de renseignements, reportez vous au manuel des commandes "sed(1)" et "ed(1)".

S.Baudry, Introduction `a la programmation Bourne Shell – v4.0 119

Chapitre 15. Utilisation de ”sed”

Commande Description

p Copie le contenu de l’espace de travail sur la sortie standard.

atexte Ajoute du texte apr`es la position courante.

itexte Ajoute du texte avant la position courante.

ctexte Change le texte de la ligne courant par

"texte".

s/expr1/expr2/[g] Substitue la premi`ere chaine satisfaisant l’expression r´eguli`ere 1 (expr1) par le texte correspondant `a l’expression r´eguli`ere 2 (expr2). L’option "g" signifie que la substitution doit se faire autant de fois que n´ecessaire sur la ligne trait´ee.

En effet, par d´efaut, la commande "s"

ne s’applique qu’`a la premi`ere chaine satisfaisant l’expression r´eguli`ere dans la ligne courante de l’espace de travail. Avec l’option "g", toute chaine satisfaisant l’expression r´eguli`ere "expr1" dans la ligne courante de l’espace de travail sera remplac´ee.

d D´etruit la ligne courante.

g Remplace le contenu de l’espace de travail (pattern space) par le contenu de l’espace m´emoire (holder space).

G Ajoute le contenu de l’espace m´emoire (hol-der space) au contenu de l’espace de travail (pattern space).

h Remplace le contenu de l’espace m´emoire (holder space) par le contenu de l’espace de travail (pattern space).

H Ajoute le contenu de l’espace de travail (pattern space) au contenu de l’espace m´emoire (holder space).

r fichier Ins`ere le contenu d’un fichier apr`es la ligne courante.

w fichier Met le contenu de l’espace de travail dans un fichier.

Exemple 15.3 :

sed -n "/lancelot/p" donjons.dragons

Copie toutes les lignes de l’espace de travail contenant la chaine "lancelot".

15.3. Formulation des requˆetes

sed -e ’/lancelot/a et arthur’ donjons.dragons Ins`ere la chaine " et arthur"1 apr`es la chaine

"lancelot" sur la totalit´e de l’espace de travail.

sed -e ’/dulac/ilancelot ’ donjons.dragons

Ins`ere la chaine "lancelot "2 avant la chaine "dulac"

sur la totalit´e de l’espace de travail.

sed -e ’s/Salut/Bonjour/g’ welcome.txt

Substitue "Salut" par "Bonjour" dans la totalit´e du fichier "welcome.txt".

15.3.4 Les symboles particuliers

Les symboles particuliers sont tous ceux des expressions r´eguli`eres

`

a l’exception des symboles "+" et "|". A cette liste, on rajoute les symboles de la commande de substitution "s". Ces symboles sont :

Symbole Description

"\(" et "\)" D´efinit une portion d’expression r´eguli`ere.

"\n" Ne fait pas partie des expressions r´eguli`eres mais repr´esente la ni`eme portion d’une expression r´eguli`ere.

"&" Ne fait pas partie des expressions r´eguli`eres mais repr´esente la portion de ligne d’entr´ee qui correspond `a l’expression r´eguli`ere.

Exemple 15.4 :

s/\([ \t]*function[ \t]*\)\([0-z]*\)\([ \t]*(.*)\)/#FONCTION \2/

La commande "sed" utilis´ee ici est la commande "s". Sa syntaxe est :

[adresse1[,adresse2]s/expr1/expr2/[g]

On constate donc que les adresses de d´ebut et de fin sont absentes. Par cons´equent, cette requ^ete s’applique `a toutes les lignes en entr´ee (cf. 15.3.2).

Apr`es analyse, il appara^ıt que cette requ^ete "sed" se d´ecompose de la fa¸con suivante :

s/

\([ \t]*function[ \t]*\)

1Notez les espaces dans la chaine ”tettarthur”.

2Notez l’espace suivant la chaine ”lancelot”.

S.Baudry, Introduction `a la programmation Bourne Shell – v4.0 121

Chapitre 15. Utilisation de ”sed”

Nous distinguons donc trois regroupements d’expression r´eguli`ere :

1. "[ \t]*funtion[ \t]*"

2. "[0-z]*"

3. "[ \t]*(.*)"

Dans le second membre de la commande "s>>

("#FONCTION \2") l’expression "\2" r´ef´erence donc la chaine correspondant `a "[0-z]*".

Analysons chaque regroupement du premier membre de cette requ^ete : "[ \t]*funtion[ \t]*".

Tout d’abord "[ \t]*" d´esigne le caract`ere space ou bien tab un nombre quelconque de fois. "function"

repr´esente tout simplement cette chaine de caract`eres.

Par cons´equent, "[ \t]*funtion[ \t]*" d´esigne la chaine "function" suivie et pr´ec´ed´ee d’espaces et de tabulations.

La seconde partie, "[0-z]*", d´esigne un des caract`eres dont le code ASCII est compris entre celui de "0"

et celui de "z"3, un nombre quelconque de fois. Nous avons donc, approximativement, une chaine de caract`ere quelconque sans espaces ni tabulations.

La troisi`eme partie, "[ \t]*(.*)" reprend la s´equence

"[ \t]*" repr´esentant une s´equence d’espaces et de tabulations un nombre quelconque de fois. "(.*)" d´esigne le caract`ere "(", suivi de caract`eres quelconques

un nombre ind´etermin´e de fois (".*"), suivi par le caract`ere ")". En conclusion, cette derni`ere partie repr´esente une chaine de caract`eres quelconque (´evuentuellement vide) encadr´ee par des parenth`eses et pr´ec´ed´ee par un nombre quelconque d’espaces et de tabulations.

Le premier membre de cette requ^ete "sed",

\([ \t]*function[ \t]*\)\([0-z]*\)\([ \t]*(.*)\) repr´esente donc :

1. le mot "function" pr´ec´ed´e et suivi d’un nombre quelconque d’espaces et de tabulations,

2. une chaine de caract`eres quelconques sans espaces ni tabulations,

3Cette plage inclue l’ensemble des chiffres, toutes les lettres minuscules et majuscules, plus un certain nombre de caract`eres de ponctuation. Pour plus de pr´ecisions, reportez-vous `a la table du jeu de caract`eresASCII.