sd - Cheatsheet de CLI Intuitivo Find & Replace
sd é uma ferramenta find-and-replace rápida com linha de comando escrita em Rust, projetada para tornar o caso comum simples. Onde sed tem sintaxe criptografada, escaping frágil e diferenças BSD/GNU, sd usa regex simples (ou strings literais), referências óbvias de capture-group ($1) e lê/escreve arquivos seguramente. Para a tarefa cotidiana “substitua X com Y através desses arquivos”, é muito mais fácil acertar que sed.
Instalação
| Platform | Command |
|---|
| Cargo (todas 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 |
Uso Básico
sd lê stdin ou arquivos. A forma é sd FIND REPLACE [FILES...].
| Command | Descrição |
|---|
| `echo “hello” | sd hello world` |
sd 'before' 'after' file.txt | Substitua em um arquivo (in place) |
sd 'before' 'after' *.txt | Substitua através de muitos arquivos |
sd --help | Lista de opção completa |
Literal vs Regex
| Command | Comportamento |
|---|
sd 'a.b' 'X' file | Regex: . matching qualquer char |
sd -s 'a.b' 'X' file | String literal (-s/--string-mode) |
sd '\d+' 'N' file | Regex digit class |
Use -s quando seu texto de busca contiver metacharacters regex que você quer tratados literalmente — sem escaping manual.
Capture Groups
sd usa referências simples $1, $2 (ou ${1} quando adjacente a texto).
# Troque "First Last" → "Last, First"
echo "Ada Lovelace" | sd '(\w+) (\w+)' '$2, $1'
# → Lovelace, Ada
# Reformate datas YYYY-MM-DD → DD/MM/YYYY
sd '(\d{4})-(\d{2})-(\d{2})' '$3/$2/$1' dates.txt
# Use braces quando o group é seguido por dígitos/letras
echo "v2" | sd 'v(\d)' 'version${1}0' # → version20
Opções Chave
| Option | Descrição |
|---|
-s, --string-mode | Trate FIND/REPLACE como strings literais |
-p, --preview | Mostre o diff/resultado sem escrever |
-f, --flags FLAGS | Regex flags: i (case-insensitive), m, s, etc. |
-n, --max-replacements N | Limite número de substituições |
| stdin/stdout | Omita arquivos para agir como um filter |
Regex Flags (-f)
| Flag | Efeito |
|---|
i | Case-insensitive |
m | Multiline (^/$ matching limites de linha) |
s | Dot matching newlines |
w | Match whole words |
# Case-insensitive replace
sd -f i 'error' 'ERROR' log.txt
Safe Preview
# Veja o QUE SERIA mudado antes de tocar arquivos
sd -p 'foo' 'bar' src/*.rs
# Então aplique
sd 'foo' 'bar' src/*.rs
Fluxos de Trabalho Comuns
# Renomeie um símbolo através de uma codebase (preview primeiro)
sd -p 'oldFunctionName' 'newFunctionName' **/*.js
sd 'oldFunctionName' 'newFunctionName' **/*.js
# Remova trailing whitespace
sd ' +$' '' file.txt
# Substitua um caminho literal (string mode evita escaping de dots/slashes)
sd -s './old/path.js' './new/path.js' config.json
# Uso pipe em um chain
cat access.log | sd '\d+\.\d+\.\d+\.\d+' '[REDACTED_IP]'
sd vs sed
| Aspecto | sd | sed |
|---|
| Sintaxe | Simples, regex moderno | Terse, histórico |
| Capture refs | $1, $2 | \1, \2 |
| Literal mode | -s (sem escaping) | Manual escaping |
| In-place | Padrão para arquivos | -i (BSD/GNU diferem) |
| Streaming edits (sed-style) | Focado em replace | Full stream editor |
sd é um find-and-replace focado; para stream editing além de substituição, sed/awk ainda se aplicam. Para busca (não replace), emparelhe com ripgrep.
Recursos