Moderní CLI: ripgrep

"Moderní CLI: ripgrep – hledání v souborech na steroidech

Arch Linux CZ2 min

Díl 5 ze 5 — Moderní CLI

Když potřebuješ najít text v souborech, sáhneš po grep. Funguje, ale pomalu, s ošklivým výstupem a musíš pamatovat na -r, --exclude-dir, --include. ripgrep (příkaz rg) tenhle úkol dělá násobně rychleji a s lepšími defaulty.

Ne náhodou používá ripgrep pod kapotou i VSCode, Zed a další moderní editory pro fulltextové hledání.

Instalace

sudo pacman -S ripgrep

Balíček je v oficiálním extra repu.

Základní použití

# hledej "TODO" ve všech souborech od aktuální složky
rg TODO

# hledej v konkrétní cestě
rg "systemd" /etc

# case-insensitive
rg -i todo

# jen názvy souborů, kde se výraz našel
rg -l TODO

# počet výskytů
rg -c TODO

# invertovaný match (řádky BEZ vzoru)
rg -v TODO

Porovnání s grep

Rekurzivní hledání:

# grep
grep -r "TODO" ~/projekty

# rg (rekurze je defaultně on)
rg TODO ~/projekty

Jen v konkrétních příponách:

# grep
grep -r --include="*.md" "arch" ~/blog

# rg
rg -t md "arch" ~/blog

Vyloučit adresáře:

# grep
grep -r --exclude-dir=node_modules "TODO" .

# rg (respektuje .gitignore automaticky)
rg TODO

Rozdíl v rychlosti je obvykle 5–10× ve prospěch rg, na velkých repozitářích i víc.

Co ripgrep umí navíc

Respektuje .gitignore, .ignore, .rgignore. Nehrabe se v node_modules, target, .venv.

Automaticky přeskakuje binárky. Nezkazí ti terminál, když omylem grepuješ v adresáři s obrázky.

Kontext výsledků.

rg -A 3 TODO        # 3 řádky za matchem
rg -B 3 TODO        # 3 řádky před
rg -C 3 TODO        # 3 řádky před i za

Filtrování podle typu souboru.

rg -t py "import"        # jen Python
rg -t md "arch"          # jen markdown
rg -t js "function"      # jen JavaScript
rg -T test "TODO"        # VYNECH testovací soubory

# seznam všech známých typů
rg --type-list

Regex out-of-the-box.

rg "^\d{4}-\d{2}-\d{2}"        # datum na začátku řádku
rg -e "error" -e "warning"     # více vzorů (OR)

Multiline hledání.

rg -U "function.*\n.*return"

Praktické triky

Zobraz jen matchující text (bez okolí):

rg -o "https?://[^ ]+"

Užitečné pro extrakci URL, IP adres, emailů.

Nahrazení textu (jen ve výstupu, nemění soubory):

rg "verze=(\d+)" -r 'v$1'

Skutečné nahrazení v souborech s sd:

# sd = moderní náhrada sed
sudo pacman -S sd
rg -l "starytext" | xargs sd "starytext" "novytext"

Vylučování dalších adresářů (kromě .gitignore):

rg TODO --glob '!vendor/'
rg TODO -g '!*.min.js'

Hledání i ve skrytých souborech:

rg -. token         # tečka = hidden
rg --hidden token

Hledání i v .gitignore:

rg -uu token        # -u = neignoruj .gitignore, -uu = ani skryté
rg -uuu token       # -uuu = ani binárky

JSON výstup pro další zpracování:

rg --json TODO | jq .

Kombinace s dalšími nástroji

S fzf pro interaktivní hledání:

rg --line-number TODO | fzf --delimiter=: --preview 'bat --color=always {1} --highlight-line {2}'

S bat pro barevný výstup:

rg -p TODO | bat -l ruby --paging=always

Otevři match ve vim:

vim $(rg -l TODO)
# nebo interaktivně:
rg -l TODO | fzf | xargs vim

Aliasy

Do ~/.zshrc:

alias grep='rg'
alias grepc='rg --context 3'
alias grepf='rg --files-with-matches'

Když opravdu potřebuješ původní grep:

\grep pattern file
command grep pattern file

Konfigurace

ripgrep čte konfiguraci z proměnné RIPGREP_CONFIG_PATH:

export RIPGREP_CONFIG_PATH=~/.config/ripgrep/config

~/.config/ripgrep/config:

# vždy ukaž kontext
--context=2

# vždy hledej ve skrytých
--hidden

# vlastní ignorace
--glob=!.git/
--glob=!node_modules/
--glob=!*.min.js

# smart-case (velké písmeno = case-sensitive)
--smart-case

# barvy
--colors=line:none
--colors=line:style:bold

Kdy se vrátit ke grep?

Ve skriptech, které musí běžet přenositelně. grep je součást POSIX standardu, rg může chybět.

Když parsuješ výstup existujícím skriptem – rg má jiný default formát.

Pro jednoduché filtrování v pipe je grep naprosto dostatečný a nemá overhead startupu.

# tohle je pořád v pořádku
ps aux | grep nginx

Shrnutí

ripgrep je nejjednodušší a zároveň nejúčinnější upgrade pro každého, kdo denně prohledává kód nebo konfigy. Rychlost + smart defaulty + .gitignore respect z něj dělají nástroj, po kterém sáhneš pokaždé, když potřebuješ najít cokoliv v souborech.

Příště sérii uzavřeme kompletním setupem – aliasy, integrace s fzf a zshrc konfigurace k okopírování.

Komentáře