sd - CLI Intuitiva de Buscar y Reemplazar
sd es una herramienta de línea de comandos rápida de buscar y reemplazar escrita en Rust, diseñada para hacer el caso común simple. Donde sed tiene sintaxis críptica, escapeado frágil y diferencias BSD/GNU, sd usa regex directo (o cadenas literales), referencias obvias de grupo de captura ($1), y lee/escribe archivos de forma segura. Para la tarea cotidiana “reemplaza X con Y en estos archivos”, es mucho más fácil acertar que con sed.
Installation
| Plataforma | Comando |
|---|
| Cargo (todas las plataformas) | cargo install sd |
| macOS (Homebrew) | brew install sd |
| Arch Linux | sudo pacman -S sd |
| Debian/Ubuntu | sudo apt install sd |
| Fedora | sudo dnf install sd |
| Verificar | sd --version |
Basic Usage
sd lee stdin o archivos. La forma es sd FIND REPLACE [FILES...].
| Comando | Descripción |
|---|
| `echo “hello” | sd hello world` |
sd 'before' 'after' file.txt | Reemplaza en un archivo (en su lugar) |
sd 'before' 'after' *.txt | Reemplaza en muchos archivos |
sd --help | Lista completa de opciones |
Literal vs Regex
| Comando | Comportamiento |
|---|
sd 'a.b' 'X' file | Regex: . coincide con cualquier carácter |
sd -s 'a.b' 'X' file | Cadena literal (-s/--string-mode) |
sd '\d+' 'N' file | Clase de dígito regex |
Usa -s cuando tu texto de búsqueda contiene metacaracteres regex que quieres tratados literalmente — sin escapeado manual.
Capture Groups
sd usa referencias simples $1, $2 (o ${1} cuando está adyacente a texto).
# Intercambia "First Last" → "Last, First"
echo "Ada Lovelace" | sd '(\w+) (\w+)' '$2, $1'
# → Lovelace, Ada
# Reformatea fechas YYYY-MM-DD → DD/MM/YYYY
sd '(\d{4})-(\d{2})-(\d{2})' '$3/$2/$1' dates.txt
# Usa llaves cuando el grupo es seguido por dígitos/letras
echo "v2" | sd 'v(\d)' 'version${1}0' # → version20
Key Options
| Opción | Descripción |
|---|
-s, --string-mode | Trata FIND/REPLACE como cadenas literales |
-p, --preview | Muestra el diff/resultado sin escribir |
-f, --flags FLAGS | Banderas regex: i (insensible a mayúsculas), m, s, etc. |
-n, --max-replacements N | Limita número de reemplazos |
| stdin/stdout | Omite archivos para actuar como un filtro |
Regex Flags (-f)
| Bandera | Efecto |
|---|
i | Insensible a mayúsculas |
m | Multilínea (^/$ coinciden con límites de línea) |
s | El punto coincide con saltos de línea |
w | Coincide con palabras completas |
# Reemplazo insensible a mayúsculas
sd -f i 'error' 'ERROR' log.txt
Safe Preview
# Ve QUÉ CAMBIARÍA antes de tocar archivos
sd -p 'foo' 'bar' src/*.rs
# Luego aplica
sd 'foo' 'bar' src/*.rs
Common Workflows
# Renombra un símbolo en todo un codebase (previsualiza primero)
sd -p 'oldFunctionName' 'newFunctionName' **/*.js
sd 'oldFunctionName' 'newFunctionName' **/*.js
# Elimina espacios en blanco al final
sd ' +$' '' file.txt
# Reemplaza una ruta literal (modo cadena evita escapear los puntos/barras)
sd -s './old/path.js' './new/path.js' config.json
# Uso pipe en una cadena
cat access.log | sd '\d+\.\d+\.\d+\.\d+' '[REDACTED_IP]'
sd vs sed
| Aspecto | sd | sed |
|---|
| Sintaxis | Regex simple y moderno | Terse, histórico |
| Referencias de captura | $1, $2 | \1, \2 |
| Modo literal | -s (sin escapeado) | Escapeado manual |
| En su lugar | Predeterminado para archivos | -i (BSD/GNU difieren) |
| Ediciones de transmisión (estilo sed) | Enfocado en reemplazo | Editor de transmisión completo |
sd es una búsqueda y reemplazo enfocada; para edición de transmisión más allá de sustitución, sed/awk sigue siendo aplicable. Para búsqueda (no reemplazo), empareja con ripgrep.
Resources