Salta ai contenuti

sd - Cheatsheet Intuitive Find & Replace CLI

sd - Cheatsheet Intuitive Find & Replace CLI

sd è uno strumento find-and-replace da command-line veloce scritto in Rust, progettato per rendere il caso comune semplice. Dove sed ha una sintassi criptica, escaping fragile, e differenze BSD/GNU, sd usa regex schietto (o literal string), ovvie riferimenti a capture-group ($1), e legge/scrive file in sicurezza. Per il quotidiano “sostituisci X con Y in questi file” task, è molto più facile da ottenere corretto che sed.

Installazione

PiattaformaComando
Cargo (tutte piattaforme)cargo install sd
macOS (Homebrew)brew install sd
Arch Linuxsudo pacman -S sd
Debian/Ubuntusudo apt install sd
Fedorasudo dnf install sd
Verificasd --version

Utilizzo di Base

sd legge stdin o file. La forma è sd FIND REPLACE [FILES...].

ComandoDescrizione
`echo “hello”sd hello world`
sd ''before'' ''after'' file.txtSostituisci in un file (in place)
sd ''before'' ''after'' *.txtSostituisci across molti file
sd --helpLista opzione completa

Literal vs Regex

ComandoComportamento
sd ''a.b'' ''X'' fileRegex: . corrisponde a any char
sd -s ''a.b'' ''X'' fileLiteral string (-s/--string-mode)
sd ''\d+'' ''N'' fileRegex digit class

Usa -s quando il tuo testo di ricerca contiene metacharacter regex che vuoi trattati letteralmente — nessun escaping manuale.

Capture Groups

sd usa semplici riferimenti $1, $2 (o ${1} quando adiacente al testo).

# Scambia "First Last" → "Last, First"
echo "Ada Lovelace" | sd '(\w+) (\w+)' '$2, $1'
# → Lovelace, Ada

# Riformatta date YYYY-MM-DD → DD/MM/YYYY
sd '(\d{4})-(\d{2})-(\d{2})' '$3/$2/$1' dates.txt

# Usa brace quando il group è seguito da digits/letters
echo "v2" | sd ''v(\d)'' ''version${1}0''   # → version20

Opzioni Chiave

OpzioneDescrizione
-s, --string-modeTratta FIND/REPLACE come literal string
-p, --previewMostra la diff/risultato senza scrivere
-f, --flags FLAGSRegex flags: i (case-insensitive), m, s, etc.
-n, --max-replacements NLimita numero di replacements
stdin/stdoutOmetti file per agire come un filter

Regex Flags (-f)

FlagEffetto
iCase-insensitive
mMultiline (^/$ match line boundaries)
sDot corrisponde a newline
wMatch whole words
# Case-insensitive replace
sd -f i ''error'' ''ERROR'' log.txt

Safe Preview

# Vedi cosa CAMBIEREBBE prima di toccare i file
sd -p ''foo'' ''bar'' src/*.rs

# Poi applica
sd ''foo'' ''bar'' src/*.rs

Workflow Comuni

# Rinomina un simbolo attraverso una codebase (preview prima)
sd -p ''oldFunctionName'' ''newFunctionName'' **/*.js
sd ''oldFunctionName'' ''newFunctionName'' **/*.js

# Rimuovi trailing whitespace
sd '' +$'' '''' file.txt

# Sostituisci un literal path (string mode evita escaping i dots/slashes)
sd -s ''./old/path.js'' ''./new/path.js'' config.json

# Pipe usage in una chain
cat access.log | sd ''\d+\.\d+\.\d+\.\d+'' ''[REDACTED_IP]''

sd vs sed

Aspettosdsed
SyntaxSimple, modern regexTerse, historical
Capture refs$1, $2\1, \2
Literal mode-s (nessun escaping)Manual escaping
In-placeDefault per file-i (BSD/GNU differiscono)
Streaming edits (sed-style)Focused on replaceFull stream editor

sd è un focused find-and-replace; per stream editing oltre substitution, sed/awk ancora si applicano. Per ricerca (non replace), pair con ripgrep.

Risorse