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.
Receta
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.
Ejemplo Práctico
# "¿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 -rnpara búsqueda recursiva con números de línearg(ripgrep) es significativamente más rápido e ignora automáticamente patrones.gitignore- Flag
-lmuestra solo nombres de archivos, útil para piping a otros comandos findcombinado con-not -pathpara excluir directorios
Profundización
find — Localiza archivos por nombre, tipo, tamaño, fecha
# 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 archivosgrep — Busca texto dentro 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/ripgrep (rg) — Reemplazo moderno de grep
# 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 testPatrones de Expresiones Regulares — Referencia Rápida
# 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 literalEjemplos Prácticos de Expresiones Regulares para Bases de Código
# 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/sed — Encuentra y reemplaza en archivos
# 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.tsxawk — Extrae y transforma texto
# 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 -rnTrampas
Cosas 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: Usarg(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
sedde macOS requiere-i ''(cadena vacía para extensión de copia de seguridad), Linux no. Solución: Usased -i '' 's/.../.../' fileen macOS o instala GNU sed:brew install gnu-sed. -
Metacaracteres regex en cadenas de búsqueda — Buscando
[,.,(etc. sin escapar. Solución: Usagrep -Forg -Fpara cadenas fijas (no-regex). -
Resultados faltantes con regex grep básico — Algunos patrones como
\d,+,\wnecesitan regex extendido. Solución: Usagrep -E(extendido) ogrep -P(compatible con Perl) para patrones avanzados.
Alternativas
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 |
Preguntas Frecuentes
¿Cuál es la diferencia entre grep y rg (ripgrep)?
rges significativamente más rápido, especialmente en bases de código grandesrgignora automáticamente archivos listados en.gitignoregrepestá preinstalado en todos lados;rgpuede necesitar instalación separada
¿Cómo busco una cadena literal que contiene caracteres especiales de regex?
grep -F "array.map((item) =>" src/
# o
rg -F "array.map((item) =>" src/- El flag
-Ftrata el patrón como una cadena fija, no una regex
¿Cómo encuentro todos los archivos modificados en la última hora?
find . -name "*.tsx" -mmin -60-mmin -60significa modificado hace menos de 60 minutos-mtime -1significa modificado en las últimas 24 horas
¿Cómo excluyo node_modules de mis búsquedas?
- Con
grep:grep -rn "pattern" --exclude-dir=node_modules . - Con
find:find . -name "*.ts" -not -path "*/node_modules/*" - Con
rg: automático (respeta.gitignore)
¿Cuál es la diferencia entre grep -E y grep -P?
-Ehabilita regex extendido (admite+,?,|,()sin escapar)-Phabilita regex compatible con Perl (admite\d,\w,\b, lookaheads)- Usa
-Epara la mayoría de casos; usa-Pcuando necesitas patrones avanzados
Trampa: ¿Por qué sed -i se comporta diferente en macOS vs Linux?
- El
sedde macOS requiere una cadena vacía para edición in-place:sed -i '' 's/old/new/g' file - El
sedde Linux no:sed -i 's/old/new/g' file - Instala GNU sed en macOS con
brew install gnu-sedpara comportamiento consistente
¿Cómo encuentro todas las definiciones de componentes React en una base de código?
rg "export (default )?(function|const) [A-Z]\w+" -t tsx- Esto coincide tanto con declaraciones de función como con componentes de función flecha
¿Cómo hago un encuentra-y-reemplaza en múltiples archivos?
find src -name "*.tsx" -exec sed -i '' 's/OldName/NewName/g' {} \;- Siempre previsualiza primero con
sed 's/OldName/NewName/g' file.tsx(sin-i)
Trampa: Mi regex grep con \d no coincide dígitos. ¿Por qué?
- El
grepbásico no admite\d; usa[0-9]en su lugar - O usa regex extendido/Perl:
grep -P "\d+" fileogrep -E "[0-9]+" file
¿Cómo cuento el número de coincidencias por archivo?
grep -rc "import" src/ | sort -t: -k2 -rn | head -10-cimprime un conteo por archivo en lugar de líneas coincidentes
¿Cómo encuentro bloques catch vacíos en archivos TypeScript?
rg -U "catch\s*\([^)]*\)\s*\{\s*\}" src/-Uhabilita coincidencias multilínea- Los bloques catch vacíos silenciosamente tragan errores y deben evitarse
¿Cómo puedo buscar definiciones de tipo TypeScript en todo el proyecto?
rg "^(export )?(type|interface) \w+" -t ts- Coincide tanto con declaraciones
typecomointerface - Añade
-lpara listar solo las rutas de archivo
Relacionado
- Esenciales de Administración de Sistemas — Gestión de procesos, disco, red y servicios
- Comandos de Desarrollador Node.js — Comandos npm, ambiente y build
- Productividad de Shell — Pipes, redirección, scripting y consejos de flujo de trabajo