Files
2025-11-30 09:06:54 +08:00

6.9 KiB

ripgrep Search Patterns Reference

Practical search patterns for efficient one-shot searches with ripgrep.

One-Shot Search Strategy

Goal: Get files + line numbers + context in ONE call.

The Primary Pattern

rg -n -C 2 -t TYPE -e 'pattern'

What this gives:

  • -n - Line numbers
  • -C 2 - 2 lines context before/after
  • -t TYPE - File type filter
  • -e 'pattern' - The search pattern

Use this as the default. Adjust only when needed.


Essential Flag Combinations

1. Standard Search with Context

rg -n -C 2 -t js -e 'functionName'

Most common pattern - gives everything needed.

rg -F -n -C 2 -t js -e 'exact.string.with.dots'

Use -F when pattern has regex special chars (. * ( ) etc.) Avoids regex escaping hell.

rg -w -n -C 2 -t js -e 'variable'

-w matches whole words only. Finds "variable" but not "variableName".

rg -i -n -C 2 -t js -e 'pattern'

-i for case-insensitive matching.

5. List Files Only (Quick Overview)

rg -l -t js -e 'pattern' | head -20

-l lists filenames only. Pipe to head to limit.

6. Count Matches

rg -c -t js -e 'pattern'

-c shows count per file.

7. Invert Match (Find Files WITHOUT Pattern)

rg -l -t js -e 'import React' | rg -v -F -e 'import { useState }'

First find files with React, then filter out files with useState.

Or simpler:

rg -L -t js -e 'pattern'

-L lists files that do NOT match.

8. Multiple Patterns (OR Logic)

rg -n -C 2 -t js -e 'pattern1' -e 'pattern2'

Matches either pattern.

9. Specific Directory

rg -n -C 2 -t js -e 'pattern' src/components

Add directory path at end to narrow scope.


Pipe Composition Patterns

Limit Results

rg -n -t js -e 'pattern' | head -30

Get first 30 result lines.

Count Total Matches

rg -n -t js -e 'pattern' | wc -l

Sort and Deduplicate

rg -o -t js -e 'import.*from.*' | sort | uniq

-o shows only matching part. Useful for extracting patterns.

Filter Results Further

rg -n -t js -e 'function' | rg -e 'export'

Find functions, then filter to only exported ones.


File Type Filters (-t)

Common types:

  • -t js - JavaScript (.js, .jsx, .mjs, .cjs, .vue)
  • -t ts - TypeScript (.ts, .tsx, .cts, .mts)
  • -t py - Python (.py, .pyi)
  • -t go - Go (.go)
  • -t rust - Rust (.rs)
  • -t java - Java (.java, .jsp, .properties)
  • -t ruby - Ruby (.rb, .gemspec, Gemfile, Rakefile)
  • -t c - C (.c, .h)
  • -t cpp - C++ (.cpp, .hpp, .cc, .hh)
  • -t sh - Shell (.sh, .bash, .zsh, .bashrc)
  • -t html - HTML (.html, .htm, .ejs)
  • -t css - CSS (.css, .scss)
  • -t md - Markdown (.md, .markdown, .mdx)
  • -t json - JSON (.json)
  • -t yaml - YAML (.yaml, .yml)

Multiple types:

rg -t js -t ts -e 'pattern'

Glob patterns (more flexible):

rg -g '*.test.js' -e 'pattern'          # Test files only
rg -g '!*.test.js' -e 'pattern'         # Exclude test files
rg -g 'src/**/*.js' -e 'pattern'        # Specific directory pattern

Pattern Syntax Quick Reference

Literal Search (Use -F)

rg -F -e 'exact.string'

When pattern has special chars, use -F instead of escaping.

Regex Patterns

rg -e 'function\s+\w+'           # Function declarations
rg -e 'import.*from\s+["\']'     # Import statements
rg -e 'class\s+\w+.*\{'          # Class definitions
rg -e '^\s*#'                    # Lines starting with #
rg -e 'TODO:|FIXME:|XXX:'        # Multiple comment markers

Common Regex Elements

  • \s - whitespace
  • \w - word character
  • \d - digit
  • . - any character
  • .* - zero or more any character
  • \b - word boundary (or use -w flag)
  • ^ - start of line
  • $ - end of line
  • [abc] - character class
  • (foo|bar) - alternation

Decision Flow

Need to search code?
│
├─ Simple pattern, no special needs?
│  → Use Grep tool (structured output)
│
├─ Need one-shot with context?
│  → rg -n -C 2 -t TYPE -e 'pattern'
│
├─ Pattern has dots, parens, special chars?
│  → rg -F -n -C 2 -t TYPE -e 'exact.string'
│
├─ Need precise word matching?
│  → rg -w -n -C 2 -t TYPE -e 'word'
│
├─ Need to find files WITHOUT something?
│  → rg -L -t TYPE -e 'pattern'
│
└─ Need to compose with other commands?
   → rg -n -t TYPE -e 'pattern' | head/wc/sort/etc

Common Workflows

"Find all uses of this function"

rg -n -C 2 -t js -e 'functionName\('

Use \( to find actual calls (not definitions).

"Which files import this package?"

rg -l -t js -e 'from ["\']package-name["\']'

"How is this class used?"

rg -n -C 3 -t py -e 'ClassName'

More context (C 3) to see usage patterns.

"Find TODOs in specific directory"

rg -n -e 'TODO:' src/

"Find files that import X but not Y"

rg -l -t js -e 'import.*from.*package-x' | rg -v -F -e 'package-y'

"Count occurrences across codebase"

rg -c -t js -e 'pattern' | rg -e ':' | wc -l

Count files with matches.


Best Practices

1. Start with Standard Pattern

rg -n -C 2 -t TYPE -e 'pattern'

Adjust only if needed.

2. Use -F for Literal Strings

Don't escape regex chars - use -F:

# BAD: rg -e 'function\(\)'
# GOOD: rg -F -e 'function()'

3. Always Use Single Quotes

# GOOD: rg -e 'pattern'
# BAD:  rg -e "pattern"  # Shell may interpret special chars

4. Use Type Filters

# GOOD: rg -t js -e 'pattern'
# LESS GOOD: rg -e 'pattern'  # Searches everything

5. Limit Large Results

rg -n -t js -e 'common_word' | head -50

6. Use -w for Precision

# Finds "test" in "testing", "latest", etc:
rg -e 'test'

# Finds only "test" as whole word:
rg -w -e 'test'

When to Use Grep Tool Instead

Use Grep tool when:

  • Simple pattern with no special flags needed
  • Want structured output modes (files/content/count)
  • Don't need to pipe results
  • Pattern doesn't need -F, -v, or -w

Use Bash(rg) when:

  • Need one-shot results with context
  • Need -F (literal), -v (invert), -w (word boundary)
  • Want to pipe/compose with other commands
  • Need maximum control and efficiency

Default to Bash(rg) for most searches - it's more efficient for one-shot results.


Summary

Default search command:

rg -n -C 2 -t TYPE -e 'pattern'

Key flags to remember:

  • -F - Literal search (avoid escaping)
  • -w - Word boundaries (precise)
  • -v - Invert match (find files WITHOUT)
  • -l - List files only
  • -L - List files that DON'T match

Compose with pipes:

rg ... | head -N      # Limit results
rg ... | wc -l        # Count
rg ... | rg ...       # Filter further

This reference provides practical patterns for efficient one-shot searches.