Zum Inhalt springen

sd - Intuitives Find & Replace CLI-Spickzettel

sd - Intuitives Find & Replace CLI-Spickzettel

sd ist ein schnelles Find-and-Replace-Command-Line-Tool, geschrieben in Rust, mit dem Ziel, den häufigen Fall einfach zu machen. Wo sed kryptische Syntax, fragile Escaping und BSD/GNU-Unterschiede hat, verwendet sd unkomplizierte Regex (oder Literal-Strings), offensichtliche Capture-Group-Referenzen ($1) und liest/schreibt Dateien sicher. Für die alltägliche “ersetze X mit Y über diese Dateien”-Aufgabe ist es viel einfacher, recht zu machen als sed.

Installation

PlattformBefehl
Cargo (alle Plattformen)cargo install sd
macOS (Homebrew)brew install sd
Arch Linuxsudo pacman -S sd
Debian/Ubuntusudo apt install sd
Fedorasudo dnf install sd
Verifizierensd --version

Grundlegende Nutzung

sd liest Stdin oder Dateien. Das Form ist sd FIND REPLACE [FILES...].

BefehlBeschreibung
`echo “hello”sd hello world`
sd 'before' 'after' file.txtErsetze in einer Datei (in place)
sd 'before' 'after' *.txtErsetze über viele Dateien
sd --helpVollständige Optionsliste

Literal vs Regex

BefehlVerhalten
sd 'a.b' 'X' fileRegex: . Passt jedes Zeichen
sd -s 'a.b' 'X' fileLiteral-String (-s/--string-mode)
sd '\d+' 'N' fileRegex-Digit-Klasse

Verwende -s, wenn dein Suchtext Regex-Metazeichen enthält, die du literal behandeln möchtest — keine manuelle Escaping.

Capture-Gruppen

sd verwendet einfache $1, $2-Referenzen (oder ${1} wenn angrenzend an Text).

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

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

# Verwende Geschweifte Klammern, wenn die Gruppe von Ziffern/Buchstaben gefolgt wird
echo "v2" | sd 'v(\d)' 'version${1}0'   # → version20

Wichtige Optionen

OptionBeschreibung
-s, --string-modeBehandle FIND/REPLACE als Literal-Strings
-p, --previewZeige die Diff/Ergebnis ohne zu schreiben
-f, --flags FLAGSRegex-Flags: i (case-insensitiv), m, s, usw.
-n, --max-replacements NLimite Anzahl der Replacements
stdin/stdoutOmit-Dateien zum Handeln als Filter

Regex-Flags (-f)

FlagEffekt
iCase-insensitiv
mMultiline (^/$ Match-Zeilen-Grenzen)
sPunkt Matches Newlines
wGanzes Wort Match
# Case-insensitiver Replace
sd -f i 'error' 'ERROR' log.txt

Sicherer Preview

# Sehe, was sich WÜRDE ändern, bevor du Dateien berührst
sd -p 'foo' 'bar' src/*.rs

# Dann wenden an
sd 'foo' 'bar' src/*.rs

Häufige Workflows

# Umbenennung eines Symbols über a Codebase (Preview first)
sd -p 'oldFunctionName' 'newFunctionName' **/*.js
sd 'oldFunctionName' 'newFunctionName' **/*.js

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

# Ersetze einen Literal-Pfad (String-Modus vermeidet Escaping die Punkte/Slashes)
sd -s './old/path.js' './new/path.js' config.json

# Pipe-Nutzung in einer Kette
cat access.log | sd '\d+\.\d+\.\d+\.\d+' '[REDACTED_IP]'

sd vs sed

Aspektsdsed
SyntaxEinfach, moderne RegexTerse, historisch
Capture-Referenzen$1, $2\1, \2
Literal-Modus-s (kein Escaping)Manuelles Escaping
In-PlaceStandard für Dateien-i (BSD/GNU differ)
Streaming-Edits (sed-style)Fokussiert auf ReplaceVollständiger Stream-Editor

sd ist ein fokussierter Find-and-Replace; für Stream-Editing über Substitution hinaus, gelten sed/awk immer noch. Zur Suche (nicht Replace), Paar mit ripgrep.

Ressourcen