Búsqueda y Expresiones Regulares
Encuentra archivos por nombre, busca texto dentro de archivos y usa patrones de expresiones regulares - la habilidad central para navegar cualquier base de código desde la terminal.
Busca en todas las páginas de la documentación
Encuentra archivos por nombre, busca texto dentro de archivos y usa patrones de expresiones regulares - la habilidad central para navegar cualquier base de código desde la terminal.
🤖 Read the SystemsArchitect.io Blog for over 100+ cloud architecture articles 🔥
Tarjeta de referencia rápida - lista para copiar y pegar.
# Encuentra archivos por nombre
find . -name "*.tsx" -type f
find . -name "page.tsx" -path "*/app/*"
# Busca texto dentro de archivos
grep -r "useState" src/
grep -rn "TODO" --include="*.ts" .
# Alternativa más rápida (ripgrep)
rg "useState" src/
rg "TODO" -t ts
# Encuentra y reemplaza en archivos
sed -i '' 's/oldFunction/newFunction/g' src/**/*.tsCuándo usarlo: Cuando necesites encontrar un archivo, ubicar dónde se usa una función, buscar un patrón en la base de código o hacer reemplazos en masa.
# "¿Dónde está definido este componente?"
rg "export.*function Header" --include="*.tsx"
# o
grep -rn "export.*function Header" --include="*.tsx" src/
# "¿Cuáles archivos importan este módulo?"
rg "from.*@/components/Button" -l
# -l = solo archivos, sin líneas coincidentes
# "Encuentra todos los comentarios TODO con contexto"
rg "TODO|FIXME|HACK" -t ts -t tsx -C 2
# -C 2 = muestra 2 líneas de contexto arriba y abajo
# "Encuentra archivos grandes en el proyecto"
find . -type f -size +1M -not -path "./node_modules/*" -not -path "./.next/*"Lo que esto demuestra:
grep -rn para búsqueda recursiva con números de línearg (ripgrep) es significativamente más rápido e ignora automáticamente patrones .gitignore-l muestra solo nombres de archivos, útil para piping a otros comandosfind combinado con -not -path para excluir directorios# Búsqueda de nombre básica (sensible a mayúsculas)
find . -name "layout.tsx"
# Insensible a mayúsculas
find . -iname "readme*"
# Por tipo de archivo
find . -type f # solo archivos
find . -type d # solo directorios
# Por patrón de extensión
find . -name "*.test.ts"
find . -name "*.md" -o -name "*.mdx" # O
# Excluye directorios
find . -name "*.ts" -not -path "*/node_modules/*" -not -path "*/.next/*"
# Por fecha de modificación
find . -name "*.tsx" -mtime -1 # modificado en las últimas 24 horas
find . -name "*.tsx" -mmin -60 # modificado en los últimos 60 minutos
find . -name "*.tsx" -newer reference.txt # más reciente que un archivo
# Por tamaño
find . -type f -size +500k # mayor que 500KB
find . -type f -size -1k # menor que 1KB
find . -type f -empty # archivos vacíos
# Ejecuta un comando en resultados
find . -name "*.test.ts" -exec wc -l {} \;
find . -name "*.log" -exec rm {} \;
find . -name "*.tsx" -exec grep -l "useState" {} \;
# Usa xargs (a menudo más rápido para muchos archivos)
find . -name "*.ts" | xargs grep "deprecated"
find . -name "*.tmp" -print0 | xargs -0 rm # maneja espacios en nombres de archivos# Búsqueda recursiva básica
grep -r "pattern" directory/
# Con números de línea
grep -rn "useState" src/
# Insensible a mayúsculas
grep -rni "error" src/
# Solo nombres de archivos (sin líneas coincidentes)
grep -rl "useEffect" src/components/
# Invierte coincidencia (líneas que NO coinciden)
grep -v "node_modules" file.txt
# Cuenta coincidencias por archivo
grep -rc "import" src/ | sort -t: -k2 -rn | head -10
# Filtra por extensión de archivo
grep -rn "fetchData" --include="*.ts" --include="*.tsx" .
grep -rn "TODO" --include="*.{ts,tsx}" .
# Excluye directorios
grep -rn "console.log" --exclude-dir=node_modules --exclude-dir=.next .
# Muestra contexto alrededor de coincidencias
grep -rn "error" -A 3 src/ # 3 líneas Después
grep -rn "error" -B 2 src/ # 2 líneas Antes
grep -rn "error" -C 2 src/ # 2 líneas Contexto (ambos)
# Coincide solo palabras completas
grep -rw "use" src/ # coincide "use" pero no "useState"
# Múltiples patrones
grep -rn -e "useState" -e "useEffect" src/# Instala
# macOS: brew install ripgrep
# Ubuntu: sudo apt install ripgrep
# Búsqueda básica (ignora automáticamente patrones .gitignore)
rg "pattern" src/
# Filtra por tipo de archivo
rg "useState" -t tsx
rg "TODO" -t ts -t tsx
# Solo nombres de archivos
rg "useEffect" -l
# Archivos que NO coinciden
rg "useEffect" --files-without-match -t tsx
# Cadena fija (sin interpretación regex)
rg -F "array.map((item) =>" src/
# Búsqueda multilínea
rg -U "export default function.*\n.*return" src/
# Reemplaza (vista previa - no modifica archivos)
rg "oldName" -r "newName"
# Muestra estadísticas
rg "TODO" --stats
# Busca archivos ocultos también
rg "SECRET" --hidden
# Patrones glob
rg "fetch" -g "*.ts" -g "!*.test.ts" # archivos ts pero no test# Anclajes
^start # línea comienza con "start"
end$ # línea termina con "end"
^exact$ # línea completa es "exact"
# Clases de caracteres
[abc] # a, b, o c
[a-z] # letra minúscula
[0-9] # dígito
[^abc] # NO a, b, o c
. # cualquier carácter único
# Cuantificadores
a* # cero o más a's
a+ # una o más a's
a? # cero o una a
a{3} # exactamente 3 a's
a{2,5} # 2 a 5 a's
# Grupos y alternancia
(foo|bar) # foo o bar
(abc)+ # una o más secuencias "abc"
# Atajos comunes
\d # dígito [0-9] (regex extendido)
\w # carácter de palabra [a-zA-Z0-9_]
\s # espacio en blanco
\b # límite de palabra
# Escapa caracteres especiales
\. # punto literal
\( # paréntesis literal# Encuentra definiciones de componentes React
rg "export (default )?(function|const) [A-Z]\w+"
# Encuentra todas las llamadas hook
rg "use[A-Z]\w+\(" -t tsx
# Encuentra declaraciones console.log (pero no console.error/warn)
rg "console\.log\(" src/
# Encuentra TODO con autor
rg "TODO\([^)]+\):" src/
# Encuentra URLs codificadas
rg "https?://[^\s\"')\]>]+" src/
# Encuentra bloques catch vacíos
rg -U "catch\s*\([^)]*\)\s*\{\s*\}" src/
# Encuentra imports de un paquete específico
rg "from ['\"]react['\"]" src/
# Encuentra códigos de color hex CSS
rg "#[0-9a-fA-F]{3,8}\b" src/
# Encuentra potenciales claves API (patrón básico)
rg "['\"][A-Za-z0-9_]{20,}['\"]" --include="*.ts" src/
# Encuentra palabras adyacentes duplicadas (errores tipográficos)
rg "\b(\w+)\s+\1\b" docs/# Reemplaza en un archivo único (macOS - '' es requerido)
sed -i '' 's/oldText/newText/g' file.tsx
# Reemplaza en un archivo único (Linux)
sed -i 's/oldText/newText/g' file.tsx
# Vista previa sin modificar (funciona en ambos)
sed 's/oldText/newText/g' file.tsx
# Reemplaza en múltiples archivos
find src -name "*.tsx" -exec sed -i '' 's/OldComponent/NewComponent/g' {} \;
# Reemplaza con regex
sed -i '' 's/className="text-[a-z]*"/className="text-base"/g' file.tsx
# Elimina líneas que coinciden un patrón
sed -i '' '/console\.log/d' src/app/page.tsx
# Reemplaza solo en líneas que coinciden una condición
sed -i '' '/import/s/react/react-dom/' file.tsx# Imprime columnas específicas
ps aux | awk '{print $1, $2, $11}' # usuario, PID, comando
# Suma una columna
wc -l src/**/*.tsx | awk '{sum += $1} END {print sum " total lines"}'
# Filtra por condición
df -h | awk '$5 > "80%"' # discos sobre 80% llenos
# Imprime líneas entre patrones
awk '/START/,/END/' file.txt
# Cuenta valores únicos
git log --format="%an" | sort | uniq -c | sort -rnCosas que te pueden morder. Cada trampa incluye qué sale mal, por qué sucede y la solución.
grep busca node_modules - Sin --exclude-dir, grep busca todo y toma una eternidad. Solución: Usa rg (respeta automáticamente .gitignore) o añade --exclude-dir=node_modules.
find retorna demasiados resultados - Buscando desde / o sin excluir directorios. Solución: Siempre limita tu búsqueda: find src/ ... y usa -not -path.
Diferencias sed entre macOS y Linux - El sed de macOS requiere -i '' (cadena vacía para extensión de copia de seguridad), Linux no. Solución: Usa sed -i '' 's/.../.../' file en macOS o instala GNU sed: brew install gnu-sed.
Metacaracteres regex en cadenas de búsqueda - Buscando [, ., ( etc. sin escapar. Solución: Usa grep -F o rg -F para cadenas fijas (no-regex).
Resultados faltantes con regex grep básico - Algunos patrones como \d, +, \w necesitan regex extendido. Solución: Usa grep -E (extendido) o grep -P (compatible con Perl) para patrones avanzados.
Otras formas de resolver el mismo problema - y cuándo cada una es la mejor opción.
| Alternativa | Usa cuando | No uses cuando |
|---|---|---|
rg (ripgrep) | Búsqueda rápida de base de código, respeta .gitignore | No está instalado en el servidor |
ag (silver searcher) | Similar a rg, ya instalado | rg está disponible (rg es generalmente más rápido) |
fd | Reemplazo moderno de find con sintaxis más simple | Scripting que necesita compatibilidad POSIX find |
| Búsqueda IDE (Cmd+Shift+F) | Contexto visual, navegación rápida a resultados | Scripting, automatización, o servidores remotos |
fzf | Búsqueda interactiva difusa de archivos y contenido | Se necesita coincidencia de patrón exacto |
rg es significativamente más rápido, especialmente en bases de código grandesrg ignora automáticamente archivos listados en .gitignoregrep está preinstalado en todos lados; rg puede necesitar instalación separadagrep -F "array.map((item) =>" src/
# o
rg -F "array.map((item) =>" src/-F trata el patrón como una cadena fija, no una regexfind . -name "*.tsx" -mmin -60-mmin -60 significa modificado hace menos de 60 minutos-mtime -1 significa modificado en las últimas 24 horasgrep: grep -rn "pattern" --exclude-dir=node_modules .find: find . -name "*.ts" -not -path "*/node_modules/*"rg: automático (respeta .gitignore)-E habilita regex extendido (admite +, ?, |, () sin escapar)-P habilita regex compatible con Perl (admite \d, \w, \b, lookaheads)-E para la mayoría de casos; usa -P cuando necesitas patrones avanzadossed de macOS requiere una cadena vacía para edición in-place: sed -i '' 's/old/new/g' filesed de Linux no: sed -i 's/old/new/g' filebrew install gnu-sed para comportamiento consistenterg "export (default )?(function|const) [A-Z]\w+" -t tsxfind src -name "*.tsx" -exec sed -i '' 's/OldName/NewName/g' {} \;sed 's/OldName/NewName/g' file.tsx (sin -i)grep básico no admite \d; usa [0-9] en su lugargrep -P "\d+" file o grep -E "[0-9]+" filegrep -rc "import" src/ | sort -t: -k2 -rn | head -10-c imprime un conteo por archivo en lugar de líneas coincidentesrg -U "catch\s*\([^)]*\)\s*\{\s*\}" src/-U habilita coincidencias multilínearg "^(export )?(type|interface) \w+" -t tstype como interface-l para listar solo las rutas de archivoRevisado por Chris St. John·Última actualización: 10 jul 2026
🤖 Read the SystemsArchitect.io Blog for over 100+ cloud architecture articles 🔥