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