s
et d
sd
est une CLI de recherche et de remplacement intuitive.
Pourquoi l'utiliser par rapport aux outils existants ?
Expressions régulières indolores. sd
utilise la syntaxe regex que vous connaissez déjà grâce à JavaScript et Python. Oubliez les bizarreries de sed
ou awk
: soyez productif immédiatement.
Mode chaîne littérale. Rechercher et remplacer sans regex. Plus de barres obliques inverses ni de rappel des caractères spéciaux qui doivent être échappés.
Facile à lire, facile à écrire. Les expressions Rechercher et remplacer sont divisées, ce qui les rend faciles à lire et à écrire. Plus besoin de jouer avec les barres obliques non fermées et échappées.
Des valeurs par défaut intelligentes et pleines de bon sens. Les valeurs par défaut suivent le bon sens et sont adaptées à une utilisation quotidienne typique.
Alors que sed fait bien plus, sd se concentre sur une seule chose et bien la faire. Voici quelques exemples triés sur le volet où sd brille.
Syntaxe plus simple pour remplacer toutes les occurrences :
sd before after
sed s/before/after/g
Remplacez les nouvelles lignes par des virgules :
sd 'n' ','
sed ':a;N;$!ba;s/n/,/g'
Extraire des éléments de chaînes contenant des barres obliques :
sd: echo "sample with /path/" | sd '.*(/.*/)' '$1'
sed: echo "sample with /path/" | sed -E 's/.*(\/.*\/)/1/g'
Avec sed, vous pouvez l'améliorer avec un délimiteur différent, mais c'est toujours compliqué :
echo "sample with /path/" | sed -E 's|.*(/.*/)|1|g'
Modification sur place des fichiers :
sd : sd before after file.txt
sed : sed -i -e 's/before/after/g' file.txt
Avec sed, vous devez vous rappeler d'utiliser -e
, sinon certaines plates-formes considéreront l'argument suivant comme un suffixe de sauvegarde.
Remplacement simple sur ~1,5 Go de JSON
hyperfine --warmup 3 --export-markdown out.md
' sed -E "s/"/ ' " ' " ' /g" *.json > /dev/null '
' sed "s/"/ ' " ' " ' /g" *.json > /dev/null '
' sd """ " ' " ' " ' " *.json > /dev/null '
Commande | Moyens] | Min…Maxi [s] |
---|---|---|
sed -E "s/"/'/g" *.json > /dev/null | 2,338 ± 0,008 | 2,332…2,358 |
sed "s/"/'/g" *.json > /dev/null | 2,365 ± 0,009 | 2,351…2,378 |
sd """ "'" *.json > /dev/null | 0,997 ± 0,006 | 0,987…1,007 |
Résultat : ~2,35 fois plus rapide
Remplacement de Regex sur un fichier json d'environ 55 M :
hyperfine --warmup 3 --export-markdown out.md
' sed -E "s:(w+):11:g" dump.json > /dev/null '
' sed "s:(w+):11:g" dump.json > /dev/null '
' sd "(w+)" "$1$1" dump.json > /dev/null '
Commande | Moyens] | Min…Maxi [s] |
---|---|---|
sed -E "s:(w+):11:g" dump.json > /dev/null | 11,315 ± 0,215 | 11.102…11.725 |
sed "s:(w+):11:g" dump.json > /dev/null | 11,239 ± 0,208 | 11.057…11.762 |
sd "(w+)" "$1$1" dump.json > /dev/null | 0,942 ± 0,004 | 0,936…0,951 |
Résultat : ~11,93 fois plus rapide
Installez via cargo
avec cargo install sd
ou via divers gestionnaires de packages
Mode chaîne littérale . Par défaut, les expressions sont traitées comme des expressions régulières. Utilisez -F
ou --fixed-strings
pour désactiver l'expression régulière.
> echo ' lots((([]))) of special chars ' | sd -F ' ((([]))) ' ' '
lots of special chars
Utilisation de base des expressions régulières - supprimons certains espaces de fin
> echo ' lorem ipsum 23 ' | sd ' s+$ ' ' '
lorem ipsum 23
Capturer des groupes
Groupes de capture indexés :
> echo ' cargo +nightly watch ' | sd ' (w+)s++(w+)s+(w+) ' ' cmd: $1, channel: $2, subcmd: $3 '
cmd: cargo, channel: nightly, subcmd: watch
Groupes de capture nommés :
> echo " 123.45 " | sd ' (?P<dollars>d+).(?P<cents>d+) ' ' $dollars dollars and $cents cents '
123 dollars and 45 cents
Dans le cas peu probable où vous tomberiez sur des ambiguïtés, résolvez-les en utilisant ${var}
au lieu de $var
. Voici un exemple :
> echo ' 123.45 ' | sd ' (?P<dollars>d+).(?P<cents>d+) ' ' $dollars_dollars and $cents_cents '
and
> echo ' 123.45 ' | sd ' (?P<dollars>d+).(?P<cents>d+) ' ' ${dollars}_dollars and ${cents}_cents '
123_dollars and 45_cents
Rechercher et remplacer dans un fichier
> sd ' window.fetch ' ' fetch ' http.js
C'est ça. Le fichier est modifié sur place.
Pour prévisualiser les modifications :
> sd -p ' window.fetch ' ' fetch ' http.js
Rechercher et remplacer dans tout le projet
Cet exemple utilise fd.
La bonne vieille philosophie Unix à la rescousse.
fd --type file --exec sd ' from "react" ' ' from "preact" '
Idem, mais avec des sauvegardes (pensez au contrôle de version).
fd --type file --exec cp {} {}.bk ; --exec sd ' from "react" ' ' from "preact" '
sd interprétera chaque argument commençant par -
comme un indicateur (potentiellement inconnu). La convention commune d'utilisation --
pour signaler la fin des drapeaux est respectée :
$ echo " ./hello foo " | sd " foo " " -w "
error: Found argument ' -w ' which wasn ' t expected, or isn ' t valid in this context
USAGE:
sd [OPTIONS] < find > < replace-with > [files]...
For more information try --help
$ echo " ./hello foo " | sd " foo " -- " -w "
./hello -w
$ echo " ./hello --foo " | sd -- " --foo " " -w "
./hello -w
Pour échapper au caractère $
, utilisez $$
:
❯ echo " foo " | sd ' foo ' ' $$bar '
$bar