s
und d
sd
ist eine intuitive Such- und Ersetzungs-CLI.
Warum es anstelle vorhandener Tools verwenden?
Schmerzlose reguläre Ausdrücke. sd
verwendet die Regex-Syntax, die Sie bereits aus JavaScript und Python kennen. Vergessen Sie den Umgang mit den Macken von sed
oder awk
– werden Sie sofort produktiv.
String-Literal-Modus. Nicht-Regex-Suchen und Ersetzen. Keine Backslashes mehr und keine Erinnerung daran, welche Zeichen besonders sind und maskiert werden müssen.
Leicht zu lesen, leicht zu schreiben. Suchen- und Ersetzen-Ausdrücke sind aufgeteilt, sodass sie einfacher zu lesen und zu schreiben sind. Kein Ärger mehr mit nicht geschlossenen und entkommenen Schrägstrichen.
Intelligente, vernünftige Standardeinstellungen. Die Standardeinstellungen folgen dem gesunden Menschenverstand und sind auf den typischen täglichen Gebrauch zugeschnitten.
Während sed noch viel mehr kann, konzentriert sich sd darauf, nur eine Sache zu tun und diese gut zu machen. Hier sind einige ausgewählte Beispiele, bei denen SD glänzt.
Einfachere Syntax zum Ersetzen aller Vorkommen:
sd before after
sed s/before/after/g
Ersetzen Sie Zeilenumbrüche durch Kommas:
sd 'n' ','
sed ':a;N;$!ba;s/n/,/g'
Extrahieren von Inhalten aus Zeichenfolgen, die Schrägstriche enthalten:
sd: echo "sample with /path/" | sd '.*(/.*/)' '$1'
sed: echo "sample with /path/" | sed -E 's/.*(\/.*\/)/1/g'
Mit sed können Sie es mit einem anderen Trennzeichen verbessern, aber es ist immer noch chaotisch:
echo "sample with /path/" | sed -E 's|.*(/.*/)|1|g'
Direkte Änderung von Dateien:
sd: sd before after file.txt
sed: sed -i -e 's/before/after/g' file.txt
Bei sed müssen Sie daran denken, -e
zu verwenden, sonst betrachten einige Plattformen das nächste Argument als Backup-Suffix.
Einfacher Ersatz bei ca. 1,5 Gigabyte 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 '
Befehl | Bedeutet] | Min…Max [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 |
Ergebnis: ~2,35-mal schneller
Regex-Ersetzung für eine ~55 MB JSON-Datei :
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 '
Befehl | Bedeutet] | Min…Max [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 |
Ergebnis: ~11,93-mal schneller
Installieren Sie es über cargo
mit cargo install sd
oder über verschiedene Paketmanager
String-Literal-Modus . Standardmäßig werden Ausdrücke als reguläre Ausdrücke behandelt. Verwenden Sie -F
oder --fixed-strings
um Regex zu deaktivieren.
> echo ' lots((([]))) of special chars ' | sd -F ' ((([]))) ' ' '
lots of special chars
Grundlegende Regex-Verwendung : Lassen Sie uns einige nachgestellte Leerzeichen kürzen
> echo ' lorem ipsum 23 ' | sd ' s+$ ' ' '
lorem ipsum 23
Erfassen Sie Gruppen
Indizierte Erfassungsgruppen:
> echo ' cargo +nightly watch ' | sd ' (w+)s++(w+)s+(w+) ' ' cmd: $1, channel: $2, subcmd: $3 '
cmd: cargo, channel: nightly, subcmd: watch
Benannte Erfassungsgruppen:
> echo " 123.45 " | sd ' (?P<dollars>d+).(?P<cents>d+) ' ' $dollars dollars and $cents cents '
123 dollars and 45 cents
Im unwahrscheinlichen Fall, dass Sie auf Unklarheiten stoßen, lösen Sie diese, indem Sie ${var}
anstelle von $var
verwenden. Hier ist ein Beispiel:
> 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
Suchen und Ersetzen in einer Datei
> sd ' window.fetch ' ' fetch ' http.js
Das ist es. Die Datei wird direkt geändert.
So zeigen Sie eine Vorschau der Änderungen an:
> sd -p ' window.fetch ' ' fetch ' http.js
Projektübergreifend suchen und ersetzen
In diesem Beispiel wird fd verwendet.
Gute alte Unix-Philosophie zur Rettung.
fd --type file --exec sd ' from "react" ' ' from "preact" '
Das Gleiche, aber mit Backups (Versionskontrolle berücksichtigen).
fd --type file --exec cp {} {}.bk ; --exec sd ' from "react" ' ' from "preact" '
sd interpretiert jedes Argument, das mit -
beginnt, als (potenziell unbekanntes) Flag. Die übliche Konvention zur Verwendung von --
zum Signalisieren des Endes von Flags wird eingehalten:
$ 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
Um das Zeichen $
zu maskieren, verwenden Sie $$
:
❯ echo " foo " | sd ' foo ' ' $$bar '
$bar