ripgrep (rg): Busca Rapida em Codigo

ripgrep (rg): Busca Rapida em Codigo

O que e ripgrep (rg)?

Conclusao: ripgrep e uma alternativa extremamente rapida ao grep escrita em Rust. rg pattern busca no diretorio atual recursivamente e respeita .gitignore para pular ruido. O binario se chama rg.

ripgrep foi criado para buscar em bases de codigo. A tarefa "buscar em todo um diretorio" que voce costumava especificar como grep -rn se torna o comportamento padrao, sem flags extras necessarias.

A primeira linha para memorizar

rg TODO

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

Premissas (ambiente alvo)

  • SO: Ubuntu / familia Debian (nomes de pacotes sao quase identicos em outras distros)
  • O binario e rg (o pacote e ripgrep)

Por que e mais rapido que o grep?

Conclusao: Tres fatores se somam: o motor de regex rapido do Rust, busca paralela entre arquivos e reducao do conjunto de busca antecipadamente via .gitignore e deteccao de binarios.

O motivo principal nao e apenas a linguagem de implementacao -- e que ripgrep busca em menos arquivos. grep -r percorre diligentemente .git/ e node_modules/, enquanto ripgrep os exclui do conjunto de candidatos desde o inicio.

Recurso grep ripgrep
Busca recursiva precisa -r padrao
Respeita .gitignore nao sim (padrao)
Arquivos binarios escaneados pulados automaticamente
Paralelismo nenhum sim
Numeros de linha precisa -n padrao no terminal

O valor na pratica nao e apenas "rapido" mas "saida limpa por padrao." Os resultados nao ficam enterrados em ruido.

Como instalar?

Conclusao: No Ubuntu/Debian use apt install ripgrep. Se a versao 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 instalacao:

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

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

Como executar uma busca basica?

Conclusao: rg pattern e a forma base. Use -i para ignorar maiusculas/minusculas, -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 padrao os resultados mostram o nome do arquivo, numero da linha e a linha correspondente, tudo colorizado.

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

rg -F e util quando voce quer encontrar uma string contendo . ou * (numeros de versao, exemplos de regex) literalmente. Nenhum escape necessario.

Como filtrar por tipo de arquivo?

Conclusao: Use -t TIPO para um grupo de linguagem/extensao, e -g 'glob' para um padrao arbitrario. Execute rg --type-list para ver os tipos disponiveis.

# 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 disponiveis:

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

Minusculo -t significa "incluir", maiusculo -T significa "excluir". Mnemonica: T para excluir (ele nega o tipo).

Como mostrar linhas ao redor de uma correspondencia?

Conclusao: Use -A N (apos), -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 saida:

# 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 ... e poderoso: passa apenas os arquivos com resultados para um comando seguinte.

Quero buscar em arquivos ignorados pelo .gitignore

Conclusao: Use --hidden para arquivos ocultos, -u (--unrestricted) para ignorar .gitignore, -uu para ambos e -uuu para buscar tudo incluindo binarios.

ripgrep padrao faz uma busca "limpa", mas as vezes voce 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 conteudo de .git/ e binarios, entao e mais lento e ruidoso. A regra pratica: comece com o padrao, depois adicione um -u por vez apenas conforme necessario.

Ele pode substituir texto?

Conclusao: -r visualiza a saida substituida. Ele nao 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 e apenas para confirmacao. O padrao seguro e 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 e uma operacao destrutiva. Sempre confirme a lista de arquivos com rg -l antes de executar.

Referencia rapida para migrar do grep

Conclusao: Na maioria dos casos voce pode trocar grep -rn por rg e funciona. Aprenda filtragem por tipo e exibicao de contexto e suas buscas diarias vivem inteiramente no ripgrep.

O que voce quer grep ripgrep
Busca recursiva em diretorio grep -rn pat . rg pat
Ignorar maiusculas/minusculas 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 extensao grep -r --include='*.py' rg -t py pat
Contexto ao redor grep -C 3 pat rg -C 3 pat

Copiar e colar: padroes que voce usara 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'

Proximas Leituras