Blog ENI : Toute la veille numérique !
🐠 -25€ dès 75€ 
+ 7 jours d'accès à la Bibliothèque Numérique ENI. Cliquez ici
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
  1. Livres et vidéos
  2. Expressions régulières
  3. bvi, l'éditeur binaire/hexadécimal plein écran
Extrait - Expressions régulières Syntaxe et mise en oeuvre (avec exercices et corrigés)
Extraits du livre
Expressions régulières Syntaxe et mise en oeuvre (avec exercices et corrigés)
1 avis
Revenir à la page d'achat du livre

bvi, l'éditeur binaire/hexadécimal plein écran

Description

bvi est un éditeur capable de traiter des fichiers quelconques : textes ou binaires (exécutables, fichiers objets, disques...). Il a été créé par Gerhard Bürgmann en 1996 pour pallier le manque d’outil de ce type sur Unix et Linux.

Il est très similaire à vi dans son mode de fonctionnement et dans ses commandes, mais permet la saisie en hexadécimal ou en binaire, ce qui est particulièrement utile lorsqu’il faut corriger (patcher) des fichiers objets, des bibliothèques d’objets, des exécutables ou des fichiers non manipulables par des éditeurs de textes.

Son affichage a l’apparence suivante :

images/09RI01.png

Il permet la modification, mais aussi l’ajout et la suppression de caractères quelconques.

L’ajout ou la suppression d’octets entraînent une modification de la taille du fichier, ce qui n’est généralement pas désiré lorsqu’on manipule des fichiers binaires. C’est la raison pour laquelle la modification de taille est désactivée par défaut. Si l’on souhaite modifier la taille du fichier que l’on édite, il faut le spécifier explicitement.

bvi est diffusé sous licence GPL (GNU Public License), et est disponible dans les principales distributions Linux. Il est également possible de le télécharger à partir...

Points communs avec vi

bvi possède de nombreux points communs avec vi puisque c’est ce dernier qui a inspiré bvi à Gerhard Bürgmann. De façon non exhaustive, on notera entre les deux éditeurs les similitudes suivantes :

  • existence du mode commandes et du mode saisie,

  • mêmes commandes de déplacement de curseur (h, j, k, l, flèches...),

  • mêmes commandes d’ajout, insertion, remplacement et suppression de caractères (a, i, r, R, x, X),

  • même commande undo (u) limitée à la dernière action effectuée,

  • mêmes commandes de positionnement sur des caractères spécifiés (f, F, t, T, ;, ,) et possibilité d’utiliser un facteur de répétition devant ces commandes,

  • mêmes commandes de recherche de chaînes (/, ?),

  • marquage des emplacements avec mx, et positionnement avec x,

  • présence d’un mode de configuration accessible avec le caractère :,

  • accès à un éditeur ligne,

  • etc.

Spécificités de bvi

bvi comporte des différences avec vi. Tout d’abord, il affiche trois groupes d’informations :

1.

la colonne de gauche affiche les adresses hexadécimales des octets relativement au début du fichier.

2.

la colonne centrale affiche les valeurs hexadécimales des octets du fichier.

3.

la colonne de droite affiche la représentation ASCII (quand elle existe) des octets du fichier.

Au lancement, le curseur est par défaut positionné dans la zone en hexadécimal (zone centrale). Il est possible de passer de cette zone à la zone en mode texte, et inversement, à l’aide de la touche images/tab.PNG en mode commandes.

La ligne en bas de l’écran affiche des informations d’état, comme le nom du fichier et son mode d’ouverture sur la gauche, et sur la droite les valeurs binaire, octale, hexadécimale, décimale et caractère de l’octet sur lequel le curseur est positionné.

Ensuite, contrairement à vi, bvi ne connaît pas le concept de ligne : il ne traite que des suites de caractères sans signification particulière pour lui. Par exemple, pour se positionner en début de fichier, il faudra utiliser 0G (aller au caractère numéro 0) et non 1G (aller à la ligne numéro 1, dans vi).

Cette différence est très importante et doit être bien comprise...

Rappel de quelques commandes

1. Avertissement

Nous ne détaillerons dans les sections qui suivent que quelques commandes de base permettant des manipulations simples avec bvi.

Pour connaître l’intégralité des commandes disponibles, veuillez vous reporter à la documentation de l’auteur :

2. Positionnement en début de ligne

La ligne dont il s’agit ici n’est pas une ligne du fichier (ce qui peut n’avoir aucun sens si le fichier édité n’est pas un fichier texte) mais une des lignes de valeurs affichées par bvi.

Le caractère ˆ permet de se positionner sur la première valeur hexadécimale de la ligne sur laquelle est positionné le curseur. La touche images/tab.PNG permet de basculer dans la troisième colonne, et de se positionner sur la valeur ASCII de ce même octet.

3. Positionnement en fin de ligne

Comme dans la section précédente, il s’agit de positionnement relatif à une ligne affichée par bvi, et non à une ligne du fichier.

Le caractère $ permet de se positionner sur la dernière valeur ASCII de la ligne sur laquelle est positionné le curseur. La touche images/tab.PNG permet de basculer dans la deuxième colonne...

Les expressions régulières

1. Généralités

Les expressions régulières basiques sont utilisables sous bvi, pour des recherches de caractères ou des recherches de valeurs hexadécimales.

2. Recherche en début de ligne

Contrairement aux éditeurs classiques (ed, sed, vi, vim, ...), le concept de ligne n’existe pas dans bvi, et il est impossible d’utiliser le caractère ˆ (qui désigne généralement le début d’une ligne) pour spécifier qu’une expression se trouve en début de ligne. L’équivalent à cette recherche avec bvi serait de spécifier que la chaîne recherchée se trouve derrière un caractère matérialisant les fins de lignes en ASCII, soit le caractère \n ou 0A en valeur hexadécimale.

Syntaxe


/\nchaîne_ASCII
 

ou


\0Achaîne_hexa
 

3. Recherche en fin de ligne

Pour les raisons citées dans la section précédente, il est impossible d’utiliser le caractère $ qui désigne généralement la fin d’une ligne. L’équivalent à cette recherche avec bvi serait de spécifier que la chaîne recherchée se trouve devant un caractère matérialisant les fins de lignes en ASCII, soit le caractère \n ou 0A en valeur hexadécimale.

Syntaxe


/chaîne_ASCII\n...

Commande bmore

On notera également l’existence, dans le paquet logiciel de la commande bvi, de la commande bmore. Également conçue par Gerhard Bürgmann, elle permet la visualisation, page par page, des valeurs hexadécimales des octets d’un fichier ou des données lues sur l’entrée standard. Elle semble, a priori, avoir la même fonction que la commande Linux suivante :


xxd | more
 

mais présente en fait le grand intérêt de pouvoir effectuer une recherche d’une chaîne exprimée directement en valeurs hexadécimales, et non en caractères ASCII comme dans more (ou less). La différence réside dans le fait que le flux de données dans lequel on peut rechercher des chaînes avec la commande more est un flux ASCII, et que les valeurs hexadécimales d’octets consécutifs dans le flux d’entrée peuvent être séparées dans le flux ASCII par des espaces, des représentations ASCII de caractères proches, des sauts de lignes ou des offsets hexadécimaux. La localisation de chaînes exprimées sous forme hexadécimale ne peut donc pas être garantie avec ces commandes.

Au contraire, la recherche avec la commande bmore est une recherche native dans le flux de données. Elle n’est donc pas parasitée par les caractères utilisés...

Exercices

1. Exercice 1

Comment rechercher en hexadécimal les chaînes correspondant à l’expression régulière AB*C ?

Solution 1


\4142*43\
 

Les codes hexadécimaux des caractères A, B et C sont respectivement 41, 42 et 43. La recherche de la chaîne suivante est déclenchée par le caractère n. La recherche en sens inverse est déclenchée par le caractère N.

Solution 2


\41 42* 43\
 

Les valeurs hexadécimales des octets peuvent être séparées par un (ou plusieurs) espace(s).

On peut également utiliser une recherche mixte comme \"A" 42* "C"\ ou \"A" 42* 43\, mais la syntaxe \41 "B"* 43\ ne fonctionne pas, tout du moins dans la version 1.3.2-2 utilisée.

2. Exercice 2

Dans le fichier suivant :


Ligne 1 : abc1  
Ligne 2 : abc2  
Ligne 3 : abc3  
Ligne 4 : abc4  
Ligne 5 : abc5  
Ligne 6 : abc6  
Ligne 7 : abc7  
Ligne 8 : abc8  
Ligne 9 : abc9 
 

rechercher les lignes contenant la chaîne Ligne, suivie d’un espace, suivie d’un chiffre strictement supérieur à 5, avec la contrainte que seule la chaîne Ligne pourra être spécifiée en ASCII : les autres caractères devront être exprimés en hexadécimal.

Solution


\"Ligne" 20 [ˆ31 32 33 34 35]\
 

Cette commande peut être écrite plus simplement de la façon suivante, en utilisant les plages de caractères :


\"Ligne" 20 [ˆ31-35]\
 

3. Exercice 3

Rechercher dans le fichier précédent le caractère 8 en fin de ligne.

Solution 1


\38 0A\
 

Le caractère hexadécimal 0A est le caractère saut de ligne, ou encore \n, ou encore newline. Rechercher le caractère 38H suivi du caractère 0AH revient donc à rechercher le caractère 8 en fin de ligne.

Solution 2


\"8" 0A\
 

Les caractères ASCII peuvent être passés entre doubles quotes dans une recherche en hexadécimal.

4. Exercice 4

Dans le fichier de l’exercice 2, dont le contenu apparaît sous bvi de la façon suivante :


00000000  4C 69 67 6E 65 20 31 20 3A 20 61 62 63 31 0A 4C Ligne 1 : abc1.L 
00000010  69 67 6E 65 20 32 20 3A 20 61 62 63 32 0A 4C 69 igne 2 : abc2.Li 
00000020  67...