ripgrep (rg): Busca Rápida em Código

ripgrep (rg): Busca Rápida em Código

O que é ripgrep (rg)?

Conclusão: ripgrep é uma alternativa extremamente rápida ao grep escrita em Rust. rg pattern busca no diretório atual recursivamente e respeita .gitignore para pular ruído. O binário se chama rg.

ripgrep foi criado para buscar em bases de código. A tarefa "buscar em todo um diretório" que você costumava especificar como grep -rn se torna o comportamento padrão, sem flags extras necessárias.

A primeira linha para memorizar

rg TODO

Isso busca no diretório atual recursivamente e automaticamente pula .git/ e artefatos de build (qualquer coisa listada em .gitignore).

Premissas (ambiente alvo)

  • SO: Ubuntu / família Debian (nomes de pacotes são quase idênticos em outras distros)
  • O binário é rg (o pacote é ripgrep)

Por que é mais rápido que o grep?

Conclusão: Três fatores se somam: o motor de regex rápido do Rust, busca paralela entre arquivos e redução do conjunto de busca antecipadamente via .gitignore e detecção de binários.

O motivo principal não é apenas a linguagem de implementação -- é que ripgrep busca em menos arquivos. grep -r percorre diligentemente .git/ e node_modules/, enquanto ripgrep os exclui do conjunto de candidatos desde o início.

Recurso grep ripgrep
Busca recursiva precisa -r padrão
Respeita .gitignore não sim (padrão)
Arquivos binários escaneados pulados automaticamente
Paralelismo nenhum sim
Números de linha precisa -n padrão no terminal

O valor na prática não é apenas "rápido" mas "saída limpa por padrão." Os resultados não ficam enterrados em ruído.

Como instalar?

Conclusão: No Ubuntu/Debian use apt install ripgrep. Se a versão empacotada for antiga, pegue o .deb do GitHub Releases ou use cargo install ripgrep.

# Ubuntu / Debian
sudo apt install ripgrep

# Fedora / familia RHEL
sudo dnf install ripgrep

# macOS (Homebrew)
brew install ripgrep

# Se voce tem um toolchain Rust
cargo install ripgrep

Verifique a instalação:

rg --version
ripgrep 14.1.0
-SIMD -AVX (compiled)
+SIMD +AVX (runtime)

A versão apt em Ubuntu antigo (ex. 18.04) é desatualizada e traz menos tipos -t. Para os recursos mais recentes, prefira o .deb do GitHub Releases.

Como executar uma busca básica?

Conclusão: rg pattern é a forma base. Use -i para ignorar maiúsculas/minúsculas, -w para corresponder palavras inteiras e -F para buscar uma string fixa (desabilitando regex).

# Buscar na arvore atual por "config"
rg config

# Ignorar maiusculas/minusculas
rg -i config

# Palavra inteira ("configure" nao vai corresponder)
rg -w config

# Tratar como string literal, nao regex
rg -F "a.b.c"

Por padrão os resultados mostram o nome do arquivo, número da linha e a linha correspondente, tudo colorizado.

src/main.rs
12:    let config = load_config();
48:    config.reload();

rg -F é útil quando você quer encontrar uma string contendo . ou * (números de versão, exemplos de regex) literalmente. Nenhum escape necessário.

Como filtrar por tipo de arquivo?

Conclusão: Use -t TIPO para um grupo de linguagem/extensão, e -g 'glob' para um padrão arbitrário. Execute rg --type-list para ver os tipos disponíveis.

# Buscar apenas em arquivos Python
rg -t py "import requests"

# Excluir JavaScript / TypeScript
rg -T js "function"

# Alvejar uma extensao diretamente com um glob
rg -g '*.md' "TODO"

# Multiplos globs (! exclui)
rg -g '*.rs' -g '!target/*' "unsafe"

Listar os tipos disponíveis:

rg --type-list | head
agda: *.agda, *.lagda
asciidoc: *.adoc, *.asc, *.asciidoc
asm: *.S, *.a51, *.asm, *.s
...

Minúsculo -t significa "incluir", maiúsculo -T significa "excluir". Mnemônica: T para excluir (ele nega o tipo).

Como mostrar linhas ao redor de uma correspondência?

Conclusão: Use -A N (após), -B N (antes) e -C N (ambos) para imprimir linhas de contexto. Essencial ao ler ao redor de um erro em logs.

# Tambem mostrar 3 linhas apos a correspondencia
rg -A 3 "panic"

# Tambem mostrar 2 linhas antes da correspondencia
rg -B 2 "Exception"

# 3 linhas de cada lado (o mais usado)
rg -C 3 "Traceback"

Outros controles de saída:

# Apenas os nomes dos arquivos correspondentes (quando voce quer uma lista)
rg -l "deprecated"

# Apenas a contagem de correspondencias
rg -c "TODO"

# Extrair apenas a parte correspondente
rg -o 'https?://[^ ]+'

rg -l pattern | xargs ... é poderoso: passa apenas os arquivos com resultados para um comando seguinte.

Quero buscar em arquivos ignorados pelo .gitignore

Conclusão: Use --hidden para arquivos ocultos, -u (--unrestricted) para ignorar .gitignore, -uu para ambos e -uuu para buscar tudo incluindo binários.

ripgrep padrão faz uma busca "limpa", mas às vezes você precisa olhar dentro de logs, .env ou node_modules. Remova os filtros em etapas.

# Incluir arquivos ocultos (.env, etc.)
rg --hidden "API_KEY"

# Ignorar .gitignore (buscar node_modules e similares)
rg -u "lodash"

# Arquivos ocultos + ignorar .gitignore
rg -uu "TODO"

# Tudo, incluindo binarios
rg -uuu "magic_bytes"

-uuu escaneia o conteúdo de .git/ e binários, então é mais lento e ruidoso. A regra prática: comece com o padrão, depois adicione um -u por vez apenas conforme necessário.

Ele pode substituir texto?

Conclusão: -r visualiza a saída substituída. Ele não modifica arquivos (apenas stdout). Para reescrever arquivos reais, combine com algo como sed -i.

# Mostrar o resultado de substituir foo por bar (arquivos inalterados)
rg 'foo' -r 'bar'

# Visualizacao de substituicao usando grupos de captura
rg '(\w+)@(\w+)' -r '$2.$1'

rg -r é apenas para confirmação. O padrão seguro é revisar o resultado, depois reescrever com sed.

# Confirmar alvos e substituicoes com rg primeiro, depois
sed -i 's/foo/bar/g' $(rg -l 'foo')

sed -i é uma operação destrutiva. Sempre confirme a lista de arquivos com rg -l antes de executar.

Referência rápida para migrar do grep

Conclusão: Na maioria dos casos você pode trocar grep -rn por rg e funciona. Aprenda filtragem por tipo e exibição de contexto e suas buscas diárias vivem inteiramente no ripgrep.

O que você quer grep ripgrep
Busca recursiva em diretório grep -rn pat . rg pat
Ignorar maiúsculas/minúsculas grep -i pat rg -i pat
Busca de string fixa grep -F str rg -F str
Apenas nomes de arquivos grep -rl pat . rg -l pat
Filtrar por extensão grep -r --include='*.py' rg -t py pat
Contexto ao redor grep -C 3 pat rg -C 3 pat

Copiar e colar: padrões que você usará muito

# Listar todo TODO no projeto
rg -n 'TODO|FIXME'

# Encontrar sites de erro apenas em Python, com contexto
rg -t py -C 3 'raise '

# Verificar segredos vazados, incluindo arquivos ocultos
rg --hidden -g '!.git/*' 'API_KEY|SECRET'

Próximas Leituras