Ir al contenido

sd - CLI Intuitiva de Buscar y Reemplazar

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

PlataformaComando
Cargo (todas las plataformas)cargo install sd
macOS (Homebrew)brew install sd
Arch Linuxsudo pacman -S sd
Debian/Ubuntusudo apt install sd
Fedorasudo dnf install sd
Verificarsd --version

Basic Usage

sd lee stdin o archivos. La forma es sd FIND REPLACE [FILES...].

ComandoDescripción
`echo “hello”sd hello world`
sd 'before' 'after' file.txtReemplaza en un archivo (en su lugar)
sd 'before' 'after' *.txtReemplaza en muchos archivos
sd --helpLista completa de opciones

Literal vs Regex

ComandoComportamiento
sd 'a.b' 'X' fileRegex: . coincide con cualquier carácter
sd -s 'a.b' 'X' fileCadena literal (-s/--string-mode)
sd '\d+' 'N' fileClase 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ónDescripción
-s, --string-modeTrata FIND/REPLACE como cadenas literales
-p, --previewMuestra el diff/resultado sin escribir
-f, --flags FLAGSBanderas regex: i (insensible a mayúsculas), m, s, etc.
-n, --max-replacements NLimita número de reemplazos
stdin/stdoutOmite archivos para actuar como un filtro

Regex Flags (-f)

BanderaEfecto
iInsensible a mayúsculas
mMultilínea (^/$ coinciden con límites de línea)
sEl punto coincide con saltos de línea
wCoincide 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

Aspectosdsed
SintaxisRegex simple y modernoTerse, histórico
Referencias de captura$1, $2\1, \2
Modo literal-s (sin escapeado)Escapeado manual
En su lugarPredeterminado para archivos-i (BSD/GNU difieren)
Ediciones de transmisión (estilo sed)Enfocado en reemplazoEditor 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