Blog ENI : Toute la veille numérique !
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
💥 Les 22 & 23 novembre : Accès 100% GRATUIT
à la Bibliothèque Numérique ENI. Je m'inscris !
  1. Livres et vidéos
  2. Expressions régulières
  3. ex, l'éditeur ligne de vi
Extrait - Expressions régulières Syntaxe et mise en œuvre (avec exercices et corrigés) (2e édition)
Extraits du livre
Expressions régulières Syntaxe et mise en œuvre (avec exercices et corrigés) (2e édition) Revenir à la page d'achat du livre

ex, l'éditeur ligne de vi

Description 

ex est un éditeur ligne, inspiré de l’éditeur ed. Il est souvent appelé éditeur ligne de vi, mais en réalité on devrait plutôt dire que vi est l’éditeur plein écran de ex, étant donné que vi a été créé comme une extension plein écran de ex.

C’est William N. Joy, dit Bill Joy, créateur du C-Shell et devenu plus tard co-fondateur de Sun Microsystems, qui a créé ex en 1976 à l’université de Berkeley. L’origine de son nom viendrait d’une évolution de em, un éditeur créé par George Coulouris, professeur au Queen Mary’s college. George Coulouris avait appelé son éditeur em pour signifier Editor for Mortals. Il pensait en effet que ed était tellement difficile à utiliser que seuls les immortels comme Ken Thompson pouvaient l’utiliser. Il développa em pour disposer d’un éditeur plus simple d’utilisation que ed.

Bill Joy développa plusieurs versions d’éditeurs à partir de em, la première fut appelée en, et la version définitive fut appelée ex : c’est la version de ex que nous connaissons actuellement.

ex possède des commandes inspirées de ed, et qui sont pour la majorité compatibles avec ce dernier....

Principe de fonctionnement 

Comme ed, ex est un éditeur ligne, c’est-à-dire qu’il n’est capable d’éditer que des lignes. Il n’affiche que les lignes que l’utilisateur lui demande d’afficher. Sa puissance, comme pour ed, réside dans sa capacité à traiter un grand nombre de lignes très rapidement grâce à sa compréhension des expressions régulières.

Les utilisateurs quotidiens de vi, comme par exemple les développeurs, utilisent très fréquemment le mode ex de vi pour faire rapidement des opérations de substitutions sur des fichiers pouvant comporter un très grand nombre de lignes.

Les sections suivantes comportent de nombreuses similitudes avec ceux du chapitre relatif à ed, car ex en est très proche. Certaines différences avec lui seront signalées.

Rappel de quelques commandes 

1. Les différents modes 

a. Interface utilisateur 

ex possède différents modes de fonctionnement. Les premiers, relatifs à son interface utilisateur, sont les suivants :

  • le mode ligne compatible avec ed (mode par défaut),

  • le mode ligne évolué (open),

  • le mode plein écran (vi).

On passe du mode ex (ou ligne) au mode open en tapant la commande open (validée par la touche [Entrée]), et du mode ex (ou ligne) au mode plein écran en tapant la commande vi (validée par la touche [Entrée]).

Le mode open est relativement peu utilisé de nos jours car un terminal moderne dispose du mode plein écran.

Le retour au mode ex se fait en tapant la commande Q.

b. Mode commandes, mode saisie 

Les autres modes sont relatifs à l’interprétation des caractères tapés au clavier : comme ed, ex dispose d’un mode de saisie de texte et d’un mode de saisie de commandes. Par défaut, ex se trouve en mode commandes après son lancement.

Contrairement à ed, on peut distinguer visuellement, dans la version GNU de ex, le mode de saisie de texte du mode de commandes grâce à l’affichage du prompt : visible en mode commandes. Ce prompt n’était pas visible dans les premières versions de ex.

Certaines commandes permettent de passer en mode saisie et d’ajouter du texte au fichier, ou de remplacer du texte présent dans le fichier.

Le caractère . tapé en début de ligne permet de sortir du mode saisie et de repasser en mode commandes.

Toutes les commandes doivent être validées par appui sur la touche [Entrée].

2. Adressage des lignes 

ex est un éditeur "ligne" : il manipule des lignes dont il faut lui spécifier les références pour lui indiquer la portée des commandes qu’on lui passe. Cette portée doit précéder immédiatement la commande à exécuter.

Les commandes peuvent s’appliquer à une ligne donnée, ou à un groupe de lignes.

Dans le cas d’une commande portant sur une seule ligne, on spécifie la référence de la ligne à traiter devant la commande. En l’absence de référence, la ligne traitée...

Quelques spécificités de ex par rapport à ed 

Il existe quelques différences de fonctionnement entre ex et ed. Nous ne citerons que les suivantes :

  • ex peut traiter plusieurs fichiers, contrairement à ed qui ne peut en traiter qu’un seul.

  • ex permet l’indentation automatique, contrairement à ed.

  • ex permet la conversion automatique des tabulations en espaces, grâce aux commandes se expandtab et retab.

  • % sous ex signifie 1,$, et n’a pas de signification sous ed.

  • se ic (ignore case) permet sous ex d’ignorer la casse des lettres dans les expressions régulières, et n’a pas d’équivalent sous ed.

  • La commande n permet de passer au fichier suivant sous ex (qui est multi-fichiers), alors qu’elle permet d’afficher les numéros de lignes sous ed, l’équivalent approximatif sous ex étant la commande se nu (setnumber).

  • La commande x permet d’enregistrer et de quitter sous ex, mais elle est inconnue sous ed où son équivalent est wq.

  • La commande Q de ed est inconnue sous ex, où elle est remplacée par q!.

  • ex possède des fonctions de manipulation de la casse des lettres.

  • La version GNU de ex affiche un prompt (:) en mode commandes, contrairement à ed dont l’affichage ne permet pas de distinguer le mode saisie du mode commandes.

  • ex affiche des messages d’erreurs en clair, plutôt qu’un...

Les expressions régulières 

1. Généralités 

ex, comme ed, ne sait traiter que les expressions régulières basiques.

2. Utilisation du caractère ^

a. Utilisation

Le caractère ^ en début d’expression spécifie un début de ligne. À l’aide de ce caractère, il est possible de rechercher une chaîne en début de ligne, ou de remplacer une chaîne se trouvant en début de ligne par une autre chaîne (éventuellement vide). Les chaînes recherchées peuvent être exprimées sous forme de chaînes de caractères ou d’expressions régulières.

Si l’on recherche spécifiquement le caractère ^ en début d’expression, il faudra lui enlever son caractère générique en le faisant précéder d’un antislash.

b. Recherche d’une expression en début de ligne 

Syntaxe

/^expr/  
?^expr? 

Exemple 1

/^kerberos/ 

Cette commande recherche à partir de la ligne courante, dans le sens descendant, la chaîne kerberos en début de ligne.

Exemple 2

?^radius-acct? 

Cette commande recherche à partir de la ligne courante, dans le sens montant, la chaîne radius-acct en début de ligne.

c. Insertion d’une chaîne en début de ligne 

Syntaxe

s/^/chaîne_à_insérer/ 

Exemple

s/^/\/*images/carre.png/p 
Cette commande insère en début de ligne courante les caractères /*images/carre.png. On notera que le caractère / est précédé d’un caractère antislash (\) afin de le distinguer d’un séparateur.

d. Substitution d’une expression en début de ligne 

Syntaxe

s/^expr/chaîne_de substitution/ 

Exemple

22,384s/^void/int/ 

Cette commande remplace, de la ligne 22 à la ligne 384, (22,384s) la chaîne void en début de ligne (^void) par la chaîne int.

3. Utilisation du caractère $ 

Le caractère $ en fin d’expression spécifie une fin de ligne. À l’aide de ce caractère, il est possible de rechercher une chaîne en fin de ligne, ou de remplacer une chaîne se trouvant en fin de ligne par une autre chaîne (éventuellement vide). Les chaînes...

Exercices 

Exercice 1 

Comment afficher, de la prochaine ligne contenant un nombre hexadécimal jusqu’à la prochaine ligne contenant un signe égal (=) encadré d’espaces, toutes les lignes contenant le mot root en minuscules ou en majuscules ?

On utilisera les spécificités de ex par rapport à ed pour alléger l’écriture.

Solution

Ce même exercice proposé dans le chapitre consacré à l’éditeur ed avait pour solution l’écriture d’une expression régulière relativement compliquée, du fait de la nécessité de spécifier les caractères majuscules et minuscules.

En utilisant la commande set ic (ignore case) spécifique de ex, on peut simplifier l’écriture de cette commande, qui devient :

se ic  
/\<[0-9a-f][0-9a-f]*\>/,/ = /g/\<root\>/p 

La commande se ic demande à ex d’ignorer la casse des lettres, et la commande suivante recherche (g) :

  • de la prochaine ligne contenant un mot constitué uniquement de caractères hexadécimaux (/\<[0-9a-f][0-9a-f]*\>/), minuscules ou majuscules,

  • jusqu’à la prochaine ligne contenant le caractère = encadré d’espaces (/ = /),

  • toutes les lignes contenant le mot root indifféremment en minuscules ou majuscules (\<root\>),

  • puis les affiche...