Outil fonctionnel pour rechercher dans des fichiers texte structurés par indentation.
Inspiré par l'ogrep de Matt Brubeck. Cet ogrep est compact et beau, mais sans fonctionnalités.
Voir aussi ogrep — portage de cet outil écrit en Python (pour être vrai, c'était le premier).
ogrep
ressemble beaucoup à grep
, les deux peuvent rechercher des correspondances et afficher leur contexte. Mais le contexte dans grep
est "N lignes avant/après la correspondance", et dans ogrep
c'est "les lignes au-dessus correspondent à celle avec une indentation inférieure".
Laissez-moi vous expliquer. J'utilise cet outil principalement lorsque je travaille avec des fichiers de construction GN, j'utiliserai donc un gros fichier BUILD.gn comme exemple. La tâche habituelle consiste à rechercher le nom du fichier source et à comprendre quelle cible inclut ce fichier et dans quelles conditions.
Retrouvons les mentions du fichier « arena.cc » :
# grep arena.cc BUILD.gn
"base/arena.cc",
Ok, maintenant que notre fichier est ici, mais nous ne connaissons pas la cible. Demandons un peu de contexte :
# grep -C2 arena.cc BUILD.gn
"base/address_tracker_linux.cc",
"base/address_tracker_linux.h",
"base/arena.cc",
"base/arena.h",
"base/backoff_entry.cc",
Non, pas très utile. Essayons ogrep
:
ogrep arena.cc BUILD.gn
102: component("net") {
385: if (!is_nacl) {
386: sources += [
409: "base/arena.cc",
Maintenant, c'est utile ! Nous savons immédiatement que le fichier est inclus dans la cible « net » sous la condition « !is_nacl ».
C'est encore mieux, car ogrep
sait utiliser les couleurs, voici une photo :
Installez Rust et Cargo, si vous ne l'avez pas encore fait, alors
cargo install ogrep
Installez Homebrew, puis
brew install kriomant/ogrep-rs/ogrep-rs
Désolé, pas encore, mais j'y travaille. Utilisez Cargo pour le moment.
Il existe de nombreuses options disponibles, exécutez avec --help
pour les lister.
L'outil est utile non seulement pour les fichiers basés sur une indentation stricte (comme la source Python) ou les fichiers de construction GN, mais aussi pour une large gamme de fichiers texte, car même ceux qui ne sont pas basés sur l'indentation sont généralement formatés pour plus de commodité.
Il existe même des hacks liés au C intégrés.
Voici une brève liste de fonctionnalités :
Le motif est un texte fixe par défaut, mais vous pouvez utiliser une expression régulière arbitraire avec -e
.
Les options habituelles -w
(correspondance à des mots entiers) et -i
(recherche insensible à la casse) sont disponibles.
L'outil préserve certaines lignes vides entre les correspondances, car il permet de séparer visuellement les groupes de correspondances liées, vous pouvez le désactiver avec --no-breaks
.
Parfois, il est utile de voir s'il y avait d'autres lignes entre celles qui correspondent. Utilisez --ellipsis
pour cela.
Si vous intégrez otool
à des outils externes, les options --print-filename
peuvent être utiles, elles indiquent d'imprimer le nom de fichier si une correspondance est trouvée.
Par défaut, les branches « if-else » sont traitées spécialement : les branches if sont conservées afin que vous connaissiez les conditions même lorsqu'une correspondance est trouvée dans la branche « else » :
Le contexte traditionnel (affichage de N lignes de début et/ou de fin autour de celle qui correspond) est également pris en charge avec les options --context/-C
, --before-context/-B
et --after-context/-A
.
# ./ogrep filename_util_icu BUILD.gn
102: component("net") {
2106: if (!is_nacl) {
2210: if (use_platform_icu_alternatives) {
2222: } else {
2228: sources += [
2229: "base/filename_util_icu.cc",
Cela peut être désactivé avec --no-smart-branches
.
--no-ignore-preprocessor
soit donné.Une gestion plus intelligente des instructions du préprocesseur (contexte parallèle) est prévue.
otool
est destiné à rechercher dans un seul fichier uniquement. Et il n’est pas si rapide à utiliser pour rechercher dans de nombreux fichiers. Mais vous pouvez l'intégrer à d'autres outils de recherche comme celui-ci :
grep -l cache_used -r . --include='*.cc' | xargs -n1 ogrep --print-filename cache_used
git grep
ogrep
a une intégration intégrée avec git grep
: lorsque l'option -g
est donnée, le deuxième argument est transmis à git grep
comme spécification de chemin. Toutes les options pertinentes ( -w
, -i
, etc.) sont également transmises automatiquement à git grep
, --print-filename
est forcé.
ogrep -g cache_used '*.cc'