Pular para o conteúdo

sd - Cheatsheet de CLI Intuitivo Find & Replace

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

PlatformCommand
Cargo (todas 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

Uso Básico

sd lê stdin ou arquivos. A forma é sd FIND REPLACE [FILES...].

CommandDescrição
`echo “hello”sd hello world`
sd 'before' 'after' file.txtSubstitua em um arquivo (in place)
sd 'before' 'after' *.txtSubstitua através de muitos arquivos
sd --helpLista de opção completa

Literal vs Regex

CommandComportamento
sd 'a.b' 'X' fileRegex: . matching qualquer char
sd -s 'a.b' 'X' fileString literal (-s/--string-mode)
sd '\d+' 'N' fileRegex 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

OptionDescrição
-s, --string-modeTrate FIND/REPLACE como strings literais
-p, --previewMostre o diff/resultado sem escrever
-f, --flags FLAGSRegex flags: i (case-insensitive), m, s, etc.
-n, --max-replacements NLimite número de substituições
stdin/stdoutOmita arquivos para agir como um filter

Regex Flags (-f)

FlagEfeito
iCase-insensitive
mMultiline (^/$ matching limites de linha)
sDot matching newlines
wMatch 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

Aspectosdsed
SintaxeSimples, regex modernoTerse, histórico
Capture refs$1, $2\1, \2
Literal mode-s (sem escaping)Manual escaping
In-placePadrão para arquivos-i (BSD/GNU diferem)
Streaming edits (sed-style)Focado em replaceFull 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