sd - Cheatsheet CLI Intuitive Trouve et Remplace
sd est un outil CLI rapide de trouve-et-remplace écrit en Rust, conçu pour rendre le cas courant simple. Là où sed a une syntaxe cryptique, une échappement fragile et des différences BSD/GNU, sd utilise la regex simple (ou les chaînes littérales), les références de groupe de capture évidentes ($1) et lit/écrit les fichiers de manière sécurisée. Pour la tâche quotidienne « remplacer X avec Y dans ces fichiers », c”est beaucoup plus facile à bien faire que sed.
Installation
| Plateforme | Commande |
|---|
| Cargo (toutes les plateformes) | 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 |
| Vérification | sd --version |
Utilisation Basique
sd lit stdin ou des fichiers. La forme est sd FIND REPLACE [FILES...].
| Commande | Description |
|---|
| `echo “hello” | sd hello world` |
sd ''before'' ''after'' file.txt | Remplacer dans un fichier (in place) |
sd ''before'' ''after'' *.txt | Remplacer dans plusieurs fichiers |
sd --help | Liste complète des options |
Littéral vs Regex
| Commande | Comportement |
|---|
sd ''a.b'' ''X'' file | Regex : . correspond à n”importe quel char |
sd -s ''a.b'' ''X'' file | Chaîne littérale (-s/--string-mode) |
sd ''\d+'' ''N'' file | Classe regex des chiffres |
Utiliser -s quand ton texte de recherche contient des caractères spéciaux regex que tu veux traiter littéralement — pas d”échappement manuel.
Groupes de Capture
sd utilise des références simples $1, $2 (ou ${1} quand adjacent au texte).
# Échanger « First Last » → « Last, First »
echo "Ada Lovelace" | sd ''(\w+) (\w+)'' ''$2, $1''
# → Lovelace, Ada
# Reformater les dates YYYY-MM-DD → DD/MM/YYYY
sd ''(\d{4})-(\d{2})-(\d{2})'' ''$3/$2/$1'' dates.txt
# Utiliser les accolades quand le groupe est suivi de chiffres/lettres
echo "v2" | sd ''v(\d)'' ''version${1}0'' # → version20
Options Clés
| Option | Description |
|---|
-s, --string-mode | Traiter FIND/REPLACE comme des chaînes littérales |
-p, --preview | Afficher le diff/résultat sans écrire |
-f, --flags FLAGS | Drapeaux regex : i (insensible à la casse), m, s, etc. |
-n, --max-replacements N | Limiter le nombre de remplacements |
| stdin/stdout | Ommettre les fichiers pour agir comme un filtre |
Drapeaux Regex (-f)
| Drapeau | Effet |
|---|
i | Insensible à la casse |
m | Multiligne (^/$ correspondent aux limites de ligne) |
s | Le point correspond aux newlines |
w | Correspondre aux mots entiers |
# Remplacer insensible à la casse
sd -f i ''error'' ''ERROR'' log.txt
Aperçu Sécurisé
# Voir ce qui CHANGERAIT avant de toucher aux fichiers
sd -p ''foo'' ''bar'' src/*.rs
# Puis appliquer
sd ''foo'' ''bar'' src/*.rs
Flux de Travail Courants
# Renommer un symbole à travers une base de code (aperçu d''abord)
sd -p ''oldFunctionName'' ''newFunctionName'' **/*.js
sd ''oldFunctionName'' ''newFunctionName'' **/*.js
# Supprimer les espaces blancs de fin
sd '' +$'' '''' file.txt
# Remplacer un chemin littéral (mode chaîne évite d''échapper les points/slashes)
sd -s ''./old/path.js'' ''./new/path.js'' config.json
# Utilisation pipe dans une chaîne
cat access.log | sd ''\d+\.\d+\.\d+\.\d+'' ''[REDACTED_IP]''
sd vs sed
| Aspect | sd | sed |
|---|
| Syntaxe | Regex simple, modernes | Terse, historique |
| Refs de capture | $1, $2 | \1, \2 |
| Mode littéral | -s (pas d”échappement) | Échappement manuel |
| In-place | Défaut pour les fichiers | -i (BSD/GNU diffèrent) |
| Édits de streaming (style sed) | Focalisé sur remplacer | Éditeur de stream complet |
sd est un trouve-et-remplace focalisé ; pour l”édition de stream au-delà de la substitution, sed/awk s”appliquent toujours. Pour chercher (pas remplacer), associer avec ripgrep.
Ressources