[{"data":1,"prerenderedAt":1090},["ShallowReactive",2],{"lesson-2026-04-03":3},{"id":4,"title":5,"body":6,"date":1072,"description":1073,"difficulty":1074,"extension":1075,"format":1076,"meta":1077,"navigation":153,"path":1078,"progression":62,"seo":1079,"stem":1080,"subtopic":1081,"tags":1082,"tldr":1087,"topic":1088,"triggered":153,"__hash__":1089},"lessons\u002Flessons\u002F2026-04-03.md","ripgrep's Hidden Power: Advanced Search Configuration",{"type":7,"value":8,"toc":1063},"minimark",[9,13,23,30,35,41,49,84,87,95,102,106,117,231,234,238,244,247,354,361,365,371,461,464,468,474,595,598,602,609,704,707,711,1056,1059],[10,11,5],"h1",{"id":12},"ripgreps-hidden-power-advanced-search-configuration",[14,15,16,17,22],"p",{},"Most developers know ripgrep as \"the fast grep replacement.\" ",[18,19,21],"cite",{"index":20},"3-9,3-11","Nearly every AI coding agent that needs to search a codebase reaches for the same binary: ripgrep. When milliseconds matter - and they absolutely matter when an LLM is waiting for context - the difference between grep and ripgrep is the difference between a responsive agent and one that feels broken."," But the real story isn't just speed—it's surgical precision through advanced configuration.",[14,24,25,29],{},[18,26,28],{"index":27},"3-25,3-26,3-28","Claude Code (Anthropic's CLI agent) uses ripgrep as one of its primary tools for understanding codebases. When you ask Claude Code to fix a bug or add a feature, it runs rg commands to find relevant code, trace dependencies, and understand call patterns. Claude Code often runs 10-30 ripgrep searches in a single task, finding function definitions, usages, imports, test files, and configuration."," This isn't luck—it's configuration mastery.",[31,32,34],"h2",{"id":33},"configuration-files-your-search-profile","Configuration Files: Your Search Profile",[14,36,37],{},[18,38,40],{"index":39},"6-9,6-10,6-11,6-12,6-13","ripgrep supports configuration files. Set RIPGREP_CONFIG_PATH to a configuration file. The file can specify one shell argument per line. Lines starting with # are ignored.",[14,42,43,44,48],{},"Create ",[45,46,47],"code",{},"~\u002F.ripgreprc"," and point to it:",[50,51,56],"pre",{"className":52,"code":53,"language":54,"meta":55,"style":55},"language-bash shiki shiki-themes github-light","export RIPGREP_CONFIG_PATH=\"$HOME\u002F.ripgreprc\"\n","bash","",[45,57,58],{"__ignoreMap":55},[59,60,63,67,71,74,78,81],"span",{"class":61,"line":62},"line",1,[59,64,66],{"class":65},"sD7c4","export",[59,68,70],{"class":69},"sgsFI"," RIPGREP_CONFIG_PATH",[59,72,73],{"class":65},"=",[59,75,77],{"class":76},"sYBdl","\"",[59,79,80],{"class":69},"$HOME",[59,82,83],{"class":76},"\u002F.ripgreprc\"\n",[14,85,86],{},"Your config becomes your search personality:",[50,88,93],{"className":89,"code":91,"language":92},[90],"language-text","# Smart case by default\n--smart-case\n\n# Always show line numbers  \n--line-number\n\n# Add context around matches\n--context=2\n\n# Ignore these patterns globally\n--glob=!*.log\n--glob=!node_modules\u002F**\n--glob=!.git\u002F**\n--glob=!dist\u002F**\n--glob=!build\u002F**\n\n# Custom file types\n--type-add=proto:*.proto\n--type-add=config:*.{yml,yaml,toml,json,ini}\n--type-add=docs:*.{md,rst,txt,adoc}\n\n# Performance tweaks\n--mmap\n","text",[45,94,91],{"__ignoreMap":55},[14,96,97,98,101],{},"Now ",[45,99,100],{},"rg pattern"," runs with your entire profile applied. No more memorizing flags.",[31,103,105],{"id":104},"preprocessing-filters-search-beyond-text","Preprocessing Filters: Search Beyond Text",[14,107,108,112,113,116],{},[18,109,111],{"index":110},"2-1,2-13","This includes, but is not limited to, configuration files, passthru, support for searching compressed files, multiline search and opt-in fancy regex support via PCRE2."," The ",[45,114,115],{},"--pre"," flag transforms any file type before searching:",[50,118,120],{"className":52,"code":119,"language":54,"meta":55,"style":55},"# Search inside compressed files\nrg --pre 'zcat' 'error' logs\u002F\n\n# Search PDF content \nrg --pre 'pdftotext {} -' 'contract' documents\u002F\n\n# Search Docker images as tar streams\nrg --pre 'docker save {} | tar -xO' 'FROM ubuntu' .\n\n# Search minified JS after beautification\nrg --pre 'js-beautify' 'function.*login' assets\u002F\n",[45,121,122,128,148,155,161,177,182,188,204,209,215],{"__ignoreMap":55},[59,123,124],{"class":61,"line":62},[59,125,127],{"class":126},"sAwPA","# Search inside compressed files\n",[59,129,131,135,139,142,145],{"class":61,"line":130},2,[59,132,134],{"class":133},"s7eDp","rg",[59,136,138],{"class":137},"sYu0t"," --pre",[59,140,141],{"class":76}," 'zcat'",[59,143,144],{"class":76}," 'error'",[59,146,147],{"class":76}," logs\u002F\n",[59,149,151],{"class":61,"line":150},3,[59,152,154],{"emptyLinePlaceholder":153},true,"\n",[59,156,158],{"class":61,"line":157},4,[59,159,160],{"class":126},"# Search PDF content \n",[59,162,164,166,168,171,174],{"class":61,"line":163},5,[59,165,134],{"class":133},[59,167,138],{"class":137},[59,169,170],{"class":76}," 'pdftotext {} -'",[59,172,173],{"class":76}," 'contract'",[59,175,176],{"class":76}," documents\u002F\n",[59,178,180],{"class":61,"line":179},6,[59,181,154],{"emptyLinePlaceholder":153},[59,183,185],{"class":61,"line":184},7,[59,186,187],{"class":126},"# Search Docker images as tar streams\n",[59,189,191,193,195,198,201],{"class":61,"line":190},8,[59,192,134],{"class":133},[59,194,138],{"class":137},[59,196,197],{"class":76}," 'docker save {} | tar -xO'",[59,199,200],{"class":76}," 'FROM ubuntu'",[59,202,203],{"class":76}," .\n",[59,205,207],{"class":61,"line":206},9,[59,208,154],{"emptyLinePlaceholder":153},[59,210,212],{"class":61,"line":211},10,[59,213,214],{"class":126},"# Search minified JS after beautification\n",[59,216,218,220,222,225,228],{"class":61,"line":217},11,[59,219,134],{"class":133},[59,221,138],{"class":137},[59,223,224],{"class":76}," 'js-beautify'",[59,226,227],{"class":76}," 'function.*login'",[59,229,230],{"class":76}," assets\u002F\n",[14,232,233],{},"The preprocessing happens transparently. ripgrep streams the transformed content without touching your original files.",[31,235,237],{"id":236},"type-system-mastery","Type System Mastery",[14,239,240],{},[18,241,243],{"index":242},"2-8,2-9,2-10","ripgrep can search specific types of files. For example, rg -tpy foo limits your search to Python files and rg -Tjs foo excludes JavaScript files from your search. ripgrep can be taught about new file types with custom matching rules.",[14,245,246],{},"Define project-specific types:",[50,248,250],{"className":52,"code":249,"language":54,"meta":55,"style":55},"# Infrastructure files\nrg --type-add 'infra:*.{tf,tfvars,hcl}' --type infra 'resource.*aws_instance'\n\n# Frontend assets\nrg --type-add 'assets:*.{scss,less,styl,vue,svelte}' --type assets '@import'\n\n# Config files that might contain secrets\nrg --type-add 'secrets:*.{env,properties,conf,ini}' --type secrets 'password|key|token'\n\n# Multiple extensions, multiple patterns\nrg --type-add 'backend:*.{go,rs,py,rb,php}' --type backend 'func.*Handler|def.*handler|function.*handle'\n",[45,251,252,257,276,280,285,302,306,311,328,332,337],{"__ignoreMap":55},[59,253,254],{"class":61,"line":62},[59,255,256],{"class":126},"# Infrastructure files\n",[59,258,259,261,264,267,270,273],{"class":61,"line":130},[59,260,134],{"class":133},[59,262,263],{"class":137}," --type-add",[59,265,266],{"class":76}," 'infra:*.{tf,tfvars,hcl}'",[59,268,269],{"class":137}," --type",[59,271,272],{"class":76}," infra",[59,274,275],{"class":76}," 'resource.*aws_instance'\n",[59,277,278],{"class":61,"line":150},[59,279,154],{"emptyLinePlaceholder":153},[59,281,282],{"class":61,"line":157},[59,283,284],{"class":126},"# Frontend assets\n",[59,286,287,289,291,294,296,299],{"class":61,"line":163},[59,288,134],{"class":133},[59,290,263],{"class":137},[59,292,293],{"class":76}," 'assets:*.{scss,less,styl,vue,svelte}'",[59,295,269],{"class":137},[59,297,298],{"class":76}," assets",[59,300,301],{"class":76}," '@import'\n",[59,303,304],{"class":61,"line":179},[59,305,154],{"emptyLinePlaceholder":153},[59,307,308],{"class":61,"line":184},[59,309,310],{"class":126},"# Config files that might contain secrets\n",[59,312,313,315,317,320,322,325],{"class":61,"line":190},[59,314,134],{"class":133},[59,316,263],{"class":137},[59,318,319],{"class":76}," 'secrets:*.{env,properties,conf,ini}'",[59,321,269],{"class":137},[59,323,324],{"class":76}," secrets",[59,326,327],{"class":76}," 'password|key|token'\n",[59,329,330],{"class":61,"line":206},[59,331,154],{"emptyLinePlaceholder":153},[59,333,334],{"class":61,"line":211},[59,335,336],{"class":126},"# Multiple extensions, multiple patterns\n",[59,338,339,341,343,346,348,351],{"class":61,"line":217},[59,340,134],{"class":133},[59,342,263],{"class":137},[59,344,345],{"class":76}," 'backend:*.{go,rs,py,rb,php}'",[59,347,269],{"class":137},[59,349,350],{"class":76}," backend",[59,352,353],{"class":76}," 'func.*Handler|def.*handler|function.*handle'\n",[14,355,356,360],{},[18,357,359],{"index":358},"8-52,8-53,8-54","Search specific file types or define your own. Useful when: Built-in file type matching isn't enough."," The type system composes—combine multiple types, exclude unwanted ones, or build complex inclusion patterns.",[31,362,364],{"id":363},"context-control-for-code-analysis","Context Control for Code Analysis",[14,366,367],{},[18,368,370],{"index":369},"8-40,8-41,8-42","Show lines after, before, or around a match. Useful when: You want surrounding context, not just isolated matching lines. Makes your search results feel story-like instead of fragmented.",[50,372,374],{"className":52,"code":373,"language":54,"meta":55,"style":55},"# Function signatures with their bodies\nrg --after-context=10 'func.*Handler'\n\n# Import statements and what follows\nrg --before-context=2 --after-context=5 '^import'\n\n# Error handling patterns with context\nrg --context=3 'panic\\!|unwrap\\(\\)' --type rust\n\n# API endpoint definitions with middleware\nrg --context=8 'app\\.(get|post|put|delete)' --type js\n",[45,375,376,381,391,395,400,413,417,422,437,441,446],{"__ignoreMap":55},[59,377,378],{"class":61,"line":62},[59,379,380],{"class":126},"# Function signatures with their bodies\n",[59,382,383,385,388],{"class":61,"line":130},[59,384,134],{"class":133},[59,386,387],{"class":137}," --after-context=10",[59,389,390],{"class":76}," 'func.*Handler'\n",[59,392,393],{"class":61,"line":150},[59,394,154],{"emptyLinePlaceholder":153},[59,396,397],{"class":61,"line":157},[59,398,399],{"class":126},"# Import statements and what follows\n",[59,401,402,404,407,410],{"class":61,"line":163},[59,403,134],{"class":133},[59,405,406],{"class":137}," --before-context=2",[59,408,409],{"class":137}," --after-context=5",[59,411,412],{"class":76}," '^import'\n",[59,414,415],{"class":61,"line":179},[59,416,154],{"emptyLinePlaceholder":153},[59,418,419],{"class":61,"line":184},[59,420,421],{"class":126},"# Error handling patterns with context\n",[59,423,424,426,429,432,434],{"class":61,"line":190},[59,425,134],{"class":133},[59,427,428],{"class":137}," --context=3",[59,430,431],{"class":76}," 'panic\\!|unwrap\\(\\)'",[59,433,269],{"class":137},[59,435,436],{"class":76}," rust\n",[59,438,439],{"class":61,"line":206},[59,440,154],{"emptyLinePlaceholder":153},[59,442,443],{"class":61,"line":211},[59,444,445],{"class":126},"# API endpoint definitions with middleware\n",[59,447,448,450,453,456,458],{"class":61,"line":217},[59,449,134],{"class":133},[59,451,452],{"class":137}," --context=8",[59,454,455],{"class":76}," 'app\\.(get|post|put|delete)'",[59,457,269],{"class":137},[59,459,460],{"class":76}," js\n",[14,462,463],{},"Context isn't just pretty output—it's essential for understanding code relationships without opening files.",[31,465,467],{"id":466},"json-output-for-tool-integration","JSON Output for Tool Integration",[14,469,470],{},[18,471,473],{"index":472},"8-49,8-50,8-51","Output matches in JSON lines format. Useful when: You want machine-readable results (for piping into scripts, or UIs). VS Code search runs a variation of this to parse results live.",[50,475,477],{"className":52,"code":476,"language":54,"meta":55,"style":55},"# Pipe to jq for processing\nrg --json 'TODO' | jq -r 'select(.type==\"match\") | \"\\(.data.path.text):\\(.data.line_number): \\(.data.lines.text)\"'\n\n# Count matches per file type\nrg --json --type-all 'function' | jq -r 'select(.type==\"match\") | .data.path.text' | grep -o '\\.[^.]*$' | sort | uniq -c\n\n# Extract function names with metadata\nrg --json --only-matching 'function\\s+\\w+' --type js | jq -r '.data | \"\\(.path.text):\\(.line_number): \\(.lines.text)\"'\n",[45,478,479,484,506,510,515,560,564,569],{"__ignoreMap":55},[59,480,481],{"class":61,"line":62},[59,482,483],{"class":126},"# Pipe to jq for processing\n",[59,485,486,488,491,494,497,500,503],{"class":61,"line":130},[59,487,134],{"class":133},[59,489,490],{"class":137}," --json",[59,492,493],{"class":76}," 'TODO'",[59,495,496],{"class":65}," |",[59,498,499],{"class":133}," jq",[59,501,502],{"class":137}," -r",[59,504,505],{"class":76}," 'select(.type==\"match\") | \"\\(.data.path.text):\\(.data.line_number): \\(.data.lines.text)\"'\n",[59,507,508],{"class":61,"line":150},[59,509,154],{"emptyLinePlaceholder":153},[59,511,512],{"class":61,"line":157},[59,513,514],{"class":126},"# Count matches per file type\n",[59,516,517,519,521,524,527,529,531,533,536,538,541,544,547,549,552,554,557],{"class":61,"line":163},[59,518,134],{"class":133},[59,520,490],{"class":137},[59,522,523],{"class":137}," --type-all",[59,525,526],{"class":76}," 'function'",[59,528,496],{"class":65},[59,530,499],{"class":133},[59,532,502],{"class":137},[59,534,535],{"class":76}," 'select(.type==\"match\") | .data.path.text'",[59,537,496],{"class":65},[59,539,540],{"class":133}," grep",[59,542,543],{"class":137}," -o",[59,545,546],{"class":76}," '\\.[^.]*$'",[59,548,496],{"class":65},[59,550,551],{"class":133}," sort",[59,553,496],{"class":65},[59,555,556],{"class":133}," uniq",[59,558,559],{"class":137}," -c\n",[59,561,562],{"class":61,"line":179},[59,563,154],{"emptyLinePlaceholder":153},[59,565,566],{"class":61,"line":184},[59,567,568],{"class":126},"# Extract function names with metadata\n",[59,570,571,573,575,578,581,583,586,588,590,592],{"class":61,"line":190},[59,572,134],{"class":133},[59,574,490],{"class":137},[59,576,577],{"class":137}," --only-matching",[59,579,580],{"class":76}," 'function\\s+\\w+'",[59,582,269],{"class":137},[59,584,585],{"class":76}," js",[59,587,496],{"class":65},[59,589,499],{"class":133},[59,591,502],{"class":137},[59,593,594],{"class":76}," '.data | \"\\(.path.text):\\(.line_number): \\(.lines.text)\"'\n",[14,596,597],{},"JSON mode transforms ripgrep into a structured data extraction engine.",[31,599,601],{"id":600},"pro-tip","Pro Tip",[14,603,604,608],{},[18,605,607],{"index":606},"1-3,1-15","Shell completions (and man page) can be created via rg --generate."," Generate completions for your shell:",[50,610,612],{"className":52,"code":611,"language":54,"meta":55,"style":55},"# Bash\nrg --generate complete-bash > ~\u002F.local\u002Fshare\u002Fbash-completion\u002Fcompletions\u002Frg\n\n# Zsh  \nrg --generate complete-zsh > ~\u002F.zfunc\u002F_rg\n\n# Fish\nrg --generate complete-fish > ~\u002F.config\u002Ffish\u002Fcompletions\u002Frg.fish\n\n# PowerShell\nrg --generate complete-powershell > rg.ps1\n",[45,613,614,619,635,639,644,658,662,667,681,685,690],{"__ignoreMap":55},[59,615,616],{"class":61,"line":62},[59,617,618],{"class":126},"# Bash\n",[59,620,621,623,626,629,632],{"class":61,"line":130},[59,622,134],{"class":133},[59,624,625],{"class":137}," --generate",[59,627,628],{"class":76}," complete-bash",[59,630,631],{"class":65}," >",[59,633,634],{"class":76}," ~\u002F.local\u002Fshare\u002Fbash-completion\u002Fcompletions\u002Frg\n",[59,636,637],{"class":61,"line":150},[59,638,154],{"emptyLinePlaceholder":153},[59,640,641],{"class":61,"line":157},[59,642,643],{"class":126},"# Zsh  \n",[59,645,646,648,650,653,655],{"class":61,"line":163},[59,647,134],{"class":133},[59,649,625],{"class":137},[59,651,652],{"class":76}," complete-zsh",[59,654,631],{"class":65},[59,656,657],{"class":76}," ~\u002F.zfunc\u002F_rg\n",[59,659,660],{"class":61,"line":179},[59,661,154],{"emptyLinePlaceholder":153},[59,663,664],{"class":61,"line":184},[59,665,666],{"class":126},"# Fish\n",[59,668,669,671,673,676,678],{"class":61,"line":190},[59,670,134],{"class":133},[59,672,625],{"class":137},[59,674,675],{"class":76}," complete-fish",[59,677,631],{"class":65},[59,679,680],{"class":76}," ~\u002F.config\u002Ffish\u002Fcompletions\u002Frg.fish\n",[59,682,683],{"class":61,"line":206},[59,684,154],{"emptyLinePlaceholder":153},[59,686,687],{"class":61,"line":211},[59,688,689],{"class":126},"# PowerShell\n",[59,691,692,694,696,699,701],{"class":61,"line":217},[59,693,134],{"class":133},[59,695,625],{"class":137},[59,697,698],{"class":76}," complete-powershell",[59,700,631],{"class":65},[59,702,703],{"class":76}," rg.ps1\n",[14,705,706],{},"With completions installed, shell tab-completion works for all ripgrep flags, file types, and glob patterns.",[31,708,710],{"id":709},"example-multi-stage-security-audit","Example: Multi-Stage Security Audit",[50,712,714],{"className":52,"code":713,"language":54,"meta":55,"style":55},"#!\u002Fbin\u002Fbash\n# security-audit.sh - Comprehensive codebase security scan\n\n# 1. Find potential secrets\necho \"=== Potential Secrets ===\"\nrg --type-add 'secrets:*.{env,properties,yaml,json,py,js,go,rs}' \\\n   --type secrets \\\n   --ignore-case \\\n   'password|secret|key|token|api_key' \\\n   --context=1 \\\n   --json | jq -r 'select(.type==\"match\") | \"\\(.data.path.text):\\(.data.line_number)\"'\n\n# 2. Check for hardcoded credentials patterns\necho \"=== Hardcoded Credentials ===\"\nrg --type-add 'code:*.{py,js,go,rs,java,php,rb}' \\\n   --type code \\\n   --pcre2 \\\n   '(?i)(password|secret|key)\\s*[=:]\\s*[\"\\'][^\"\\'\n]{8,}[\"\\']' \\\n   --only-matching \\\n   --line-number\n\n# 3. Find SQL injection risks\necho \"=== SQL Injection Risks ===\"\nrg --type-add 'web:*.{py,js,php,rb,java}' \\\n   --type web \\\n   --multiline \\\n   --pcre2 \\\n   '(?s)(query|execute).*\\+.*\\$\\{|\\$[a-zA-Z]' \\\n   --context=2\n\n# 4. Look for debug\u002Fdevelopment code\necho \"=== Debug Code ===\"\nrg --type-add 'all-code:*.{py,js,go,rs,java,php,rb,cpp,c}' \\\n   --type all-code \\\n   'console\\.log|print\\(|debug|TODO.*SECURITY|FIXME.*AUTH' \\\n   --line-number\n",[45,715,716,721,726,730,735,743,755,764,771,778,785,799,804,810,818,830,840,848,854,866,872,878,883,889,895,907,913,919,925,975,981,986,992,998,1012,1018,1051],{"__ignoreMap":55},[59,717,718],{"class":61,"line":62},[59,719,720],{"class":126},"#!\u002Fbin\u002Fbash\n",[59,722,723],{"class":61,"line":130},[59,724,725],{"class":126},"# security-audit.sh - Comprehensive codebase security scan\n",[59,727,728],{"class":61,"line":150},[59,729,154],{"emptyLinePlaceholder":153},[59,731,732],{"class":61,"line":157},[59,733,734],{"class":126},"# 1. Find potential secrets\n",[59,736,737,740],{"class":61,"line":163},[59,738,739],{"class":137},"echo",[59,741,742],{"class":76}," \"=== Potential Secrets ===\"\n",[59,744,745,747,749,752],{"class":61,"line":179},[59,746,134],{"class":133},[59,748,263],{"class":137},[59,750,751],{"class":76}," 'secrets:*.{env,properties,yaml,json,py,js,go,rs}'",[59,753,754],{"class":137}," \\\n",[59,756,757,760,762],{"class":61,"line":184},[59,758,759],{"class":137},"   --type",[59,761,324],{"class":76},[59,763,754],{"class":137},[59,765,766,769],{"class":61,"line":190},[59,767,768],{"class":137},"   --ignore-case",[59,770,754],{"class":137},[59,772,773,776],{"class":61,"line":206},[59,774,775],{"class":76},"   'password|secret|key|token|api_key'",[59,777,754],{"class":137},[59,779,780,783],{"class":61,"line":211},[59,781,782],{"class":137},"   --context=1",[59,784,754],{"class":137},[59,786,787,790,792,794,796],{"class":61,"line":217},[59,788,789],{"class":137},"   --json",[59,791,496],{"class":65},[59,793,499],{"class":133},[59,795,502],{"class":137},[59,797,798],{"class":76}," 'select(.type==\"match\") | \"\\(.data.path.text):\\(.data.line_number)\"'\n",[59,800,802],{"class":61,"line":801},12,[59,803,154],{"emptyLinePlaceholder":153},[59,805,807],{"class":61,"line":806},13,[59,808,809],{"class":126},"# 2. Check for hardcoded credentials patterns\n",[59,811,813,815],{"class":61,"line":812},14,[59,814,739],{"class":137},[59,816,817],{"class":76}," \"=== Hardcoded Credentials ===\"\n",[59,819,821,823,825,828],{"class":61,"line":820},15,[59,822,134],{"class":133},[59,824,263],{"class":137},[59,826,827],{"class":76}," 'code:*.{py,js,go,rs,java,php,rb}'",[59,829,754],{"class":137},[59,831,833,835,838],{"class":61,"line":832},16,[59,834,759],{"class":137},[59,836,837],{"class":76}," code",[59,839,754],{"class":137},[59,841,843,846],{"class":61,"line":842},17,[59,844,845],{"class":137},"   --pcre2",[59,847,754],{"class":137},[59,849,851],{"class":61,"line":850},18,[59,852,853],{"class":76},"   '(?i)(password|secret|key)\\s*[=:]\\s*[\"\\'][^\"\\'\n",[59,855,857,860,863],{"class":61,"line":856},19,[59,858,859],{"class":76},"]{8,}[\"",[59,861,862],{"class":137},"\\'",[59,864,865],{"class":76},"]' \\\n",[59,867,869],{"class":61,"line":868},20,[59,870,871],{"class":76},"   --only-matching \\\n",[59,873,875],{"class":61,"line":874},21,[59,876,877],{"class":76},"   --line-number\n",[59,879,881],{"class":61,"line":880},22,[59,882,154],{"emptyLinePlaceholder":153},[59,884,886],{"class":61,"line":885},23,[59,887,888],{"class":76},"# 3. Find SQL injection risks\n",[59,890,892],{"class":61,"line":891},24,[59,893,894],{"class":76},"echo \"=== SQL Injection Risks ===\"\n",[59,896,898,901,904],{"class":61,"line":897},25,[59,899,900],{"class":76},"rg --type-add 'web:",[59,902,903],{"class":137},"*",[59,905,906],{"class":76},".{py,js,php,rb,java}' \\\n",[59,908,910],{"class":61,"line":909},26,[59,911,912],{"class":76},"   --type web \\\n",[59,914,916],{"class":61,"line":915},27,[59,917,918],{"class":76},"   --multiline \\\n",[59,920,922],{"class":61,"line":921},28,[59,923,924],{"class":76},"   --pcre2 \\\n",[59,926,928,931,934,937,940,943,946,949,952,955,957,960,962,964,967,969,972],{"class":61,"line":927},29,[59,929,930],{"class":76},"   '",[59,932,933],{"class":69},"(",[59,935,936],{"class":65},"?",[59,938,939],{"class":69},"s)(",[59,941,942],{"class":133},"query",[59,944,945],{"class":65},"|",[59,947,948],{"class":133},"execute",[59,950,951],{"class":69},")",[59,953,954],{"class":76},".",[59,956,903],{"class":137},[59,958,959],{"class":137},"\\+",[59,961,954],{"class":76},[59,963,903],{"class":137},[59,965,966],{"class":137},"\\$\\{",[59,968,945],{"class":65},[59,970,971],{"class":133},"\\$[a-zA-Z]",[59,973,974],{"class":133},"' \\\n",[59,976,978],{"class":61,"line":977},30,[59,979,980],{"class":133},"   --context=2\n",[59,982,984],{"class":61,"line":983},31,[59,985,154],{"emptyLinePlaceholder":153},[59,987,989],{"class":61,"line":988},32,[59,990,991],{"class":133},"# 4. Look for debug\u002Fdevelopment code\n",[59,993,995],{"class":61,"line":994},33,[59,996,997],{"class":133},"echo \"=== Debug Code ===\"\n",[59,999,1001,1004,1007,1010],{"class":61,"line":1000},34,[59,1002,1003],{"class":133},"rg --type-add '",[59,1005,1006],{"class":133},"all-code:*.",[59,1008,1009],{"class":76},"{py,js,go,rs,java,php,rb,cpp,c}",[59,1011,974],{"class":133},[59,1013,1015],{"class":61,"line":1014},35,[59,1016,1017],{"class":133},"   --type all-code \\\n",[59,1019,1021,1023,1026,1028,1031,1034,1036,1039,1041,1044,1046,1049],{"class":61,"line":1020},36,[59,1022,930],{"class":133},[59,1024,1025],{"class":133},"console\\.log",[59,1027,945],{"class":65},[59,1029,1030],{"class":137},"print",[59,1032,1033],{"class":69},"\\(",[59,1035,945],{"class":65},[59,1037,1038],{"class":133},"debug",[59,1040,945],{"class":65},[59,1042,1043],{"class":133},"TODO.*SECURITY",[59,1045,945],{"class":65},[59,1047,1048],{"class":133},"FIXME.*AUTH",[59,1050,974],{"class":133},[59,1052,1054],{"class":61,"line":1053},37,[59,1055,877],{"class":133},[14,1057,1058],{},"This script demonstrates ripgrep's power as a security analysis engine—not just a search tool, but a configurable code inspection platform. The combination of custom types, preprocessing, regex engines, and output formats transforms simple text search into sophisticated codebase analysis.",[1060,1061,1062],"style",{},"html pre.shiki code .sD7c4, html code.shiki .sD7c4{--shiki-default:#D73A49}html pre.shiki code .sgsFI, html code.shiki .sgsFI{--shiki-default:#24292E}html pre.shiki code .sYBdl, html code.shiki .sYBdl{--shiki-default:#032F62}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}html pre.shiki code .s7eDp, html code.shiki .s7eDp{--shiki-default:#6F42C1}html pre.shiki code .sYu0t, html code.shiki .sYu0t{--shiki-default:#005CC5}",{"title":55,"searchDepth":130,"depth":130,"links":1064},[1065,1066,1067,1068,1069,1070,1071],{"id":33,"depth":130,"text":34},{"id":104,"depth":130,"text":105},{"id":236,"depth":130,"text":237},{"id":363,"depth":130,"text":364},{"id":466,"depth":130,"text":467},{"id":600,"depth":130,"text":601},{"id":709,"depth":130,"text":710},"2026-04-03","Most developers know ripgrep as \"the fast grep replacement.\" Nearly every AI coding agent that needs to search a codebase reaches for the same binary: ripgrep. When milliseconds matter - and they absolutely matter when an LLM is waiting for context - the difference between grep and ripgrep is the difference between a responsive agent and one that feels broken. But the real story isn't just speed—it's surgical precision through advanced configuration.","intermediate","md","deep-dive",{},"\u002Flessons\u002F2026-04-03",{"title":5,"description":1073},"lessons\u002F2026-04-03","ripgrep-advanced",[1083,1084,1085,1086],"ripgrep","search","performance","configuration","Beyond basic searching, ripgrep's configuration system, preprocessing filters, and specialized flags transform it from fast grep into a surgical code analysis engine.","tools","0so1PENQ8wwg9Znu7zEpj_6Ur0OfIrWjucnemuCdfeQ",1775506334963]