ripgrep 11 est disponible et marque un changement de numérotation de l'outil de recherche d'expressions régulières
Compatible avec VS Code

Le , par Patrick Ruiz

61PARTAGES

13  0 
« ripgrep est un outil ligne de commande qui recherche dans vos fichiers les motifs que vous lui donnez. ripgrep se comporte comme si vous lisiez chaque fichier ligne par ligne. Si une ligne correspond au motif fourni à ripgrep, cette ligne sera imprimée. Si une ligne ne correspond pas au motif, la ligne n'est pas imprimée », indique l’auteur.

L’un des modes de mode de fonctionnement les plus utilisés de ripgrep est celui dit de recherche récursive. Un développeur peut s’en servir pour rechercher des motifs au sein de la totalité des fichiers d’un répertoire donné. Illustration avec le cas de la recherche de toutes les définitions de fonctions qui ont le mot write pour nom.

Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ rg 'fn write\('
src/printer.rs
469:    fn write(&mut self, buf: &[u8]) {

termcolor/src/lib.rs
227:    fn write(&mut self, b: &[u8]) -> io::Result<usize> {
250:    fn write(&mut self, b: &[u8]) -> io::Result<usize> {
428:    fn write(&mut self, b: &[u8]) -> io::Result<usize> { self.wtr.write(b) }
441:    fn write(&mut self, b: &[u8]) -> io::Result<usize> { self.wtr.write(b) }
454:    fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
511:    fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
848:    fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
915:    fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
949:    fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
1114:    fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
1348:    fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
1353:    fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
Dans cet exemple, l’utilisateur ne spécifie pas de fichier. En l’absence de chemin d’accès, ce que ripgrep fait par défaut est d’effectuer les recherches au sein du répertoire courant. Ici, ripgrep renvoie des définitions de fonctions trouvées au sein de fichiers dans les répertoires src et termcolor de l’arborescence des sources de ripgrep.

L’outil est compatible avec Visual Studio Code – l’éditeur open source et multiplateformes de Microsoft – et Atom. Dans le cas de Visual Studio Code, la fonctionnalité de recherche multi lignes dont on a fait mention à l’occasion de la sortie de la version 1.29https://www.developpez.com/actu/233131/Visual-Studio-Code-1-29-est-disponible-apercu-des-nouveautes-dans-l-editeur-de-code-open-source-et-multiplateforme-de-Microsoft/ s’appuie sur ripgrep. Par exemple, un développeur qui a de la peine à localiser une section de code particulière peut s’en servir. Illustration avec un motif de recherche constitué des balises <body> et </body>.


La version 11 de ripgrep est disponible depuis peu et marque un changement dans la numérotation de l’outil ; on passe de 0.10.0 à 11.0.0. D’après la note d’information y relative, rigrep 11 est une nouvelle version majeure à partir de laquelle les numéros feront l’objet d’incrémentations un certain nombre de fois par année.

La disponibilité de cette nouvelle mouture fait suite à des signalements d’utilisateurs relatifs à la lenteur de l’outil lors de cas d’utilisation avec les drapeaux -f et -F. ripgrep 11 apporte réponse à ces situations où l’on fournit en même temps plusieurs motifs de recherche. D’après le développeur derrière l’outil, l’utilisation de l’une des commandes rg -f motifs de recherche ou rg -F motifs de recherche devrait déboucher sur une obtention plus rapide des résultats.

Après la recherche récursive, l’une des fonctionnalités les plus usitées de ripgrep est celle de filtrage automatique, c’est-à-dire, celle qui permet d’indiquer à l’outil ce sur quoi une recherche ne porte pas. Avec la sortie de la version 11, Andrew Gallant annonce des améliorations en ce qui concerne la prise en charge du filtrage automatique pour Apache Thrift, ASP, Bazel, Brotli, BuildStream, bzip2, C, C++, Cython, gzip, Java, Make, Postscript, QML, Tex, XML, xz, zig et zstd.

ripgrep : outil de recherche récursive d’expressions régulières le plus rapide ?

Du point de vue de la vitesse, la réponse d’ après Andrew Gallant est oui. « ripgrep est plus rapide que grep, ag, git grep, ucg, pt, sift », précise-t-il. Une vingtaine de résultats de benchmark officiels de comparaison avec d’autres outils de recherche récursive d’expressions régulières est disponible. ripgrep y est comparé à différents outils de recherche sur le terrain de la recherche de motifs au sein d’une version compilée du noyau de Linux.


Résultats de recherche du motif \wAh (mots contenant la chaîne de caractères Ah)

Mais, des résultats de benchmark, ça se discute. Noter à ce propos que sur bon nombre de résultats proposés, ripgrep est au coude-à-coude avec Universal Code Grep (ucg) comme l’auteur finit par le reconnaître. « Prenez également en compte que ces benchmarks ont été exécutés sur une instance EC2 qui utilise une machine virtuelle, ce qui est de nature à pénaliser des outils de recherche qui s’appuient sur des cartes de la mémoire », prévient-t-il.

Source : Notes de version

Et vous ?

Qu’en pensez-vous ?

Faites-vous usage de ripgrep ? Si oui, comment le comparez-vous aux autres outils de recherche d’expressions régulières ? Est-il le plus rapide ?

Quel est votre outil favori de recherche d’expressions régulières ? Pourquoi ?

Voir aussi :

La rubrique Libres & Open Source

Une erreur dans cette actualité ? Signalez-le nous !

Avatar de mothsART
Membre régulier https://www.developpez.com
Le 18/04/2019 à 1:53
Du peux que j'ai suivi ce projet, j'ai été impressionné par la qualité de son avancement.
L'algo est basé sur une machine à état fini.
C'est écrit dans le langage Rust (qui est sans doute jeune en terme d'optimisation à la compilation comparé à un dinosaure comme C++) et le nombre de doc et de tests unitaires est tout simplement colossale.
L'auteur a effectué un réel comparatif en profondeur des différents softs "équivalents".
Il a mis en place des vrais benchmarks : travaille bien plus coûteux mais plus ingrat que l'écriture de code en lui-même.
Une fois en place, il essai d'en tirer des leçons. Sa dernière lubie : il a identifier que manipuler des chaines de caractères en Rust avait un coût au runtime non négligeable car pleinement compatible UTF8.
C/C++ triche d'avantage sur ce point. Résultat des courses, il crée un type string plus souple afin de gagner en perf sur ce terrain.
La prochaine étape c'est peut-être du JIT dans la lib de regex.

De ce que je lis ici https://github.com/gvansickle/ucg/issues/102, les auteurs respectifs de ripgrep et ucg ont plutôt tendance à se tirer vers le haut.

 
Contacter le responsable de la rubrique Libres & Open Source

Partenaire : Hébergement Web