s
pencarian & d
tempat sd
adalah CLI temukan & ganti yang intuitif.
Mengapa menggunakannya pada alat yang sudah ada?
Ekspresi reguler tanpa rasa sakit. sd
menggunakan sintaks regex yang sudah Anda ketahui dari JavaScript dan Python. Lupakan berurusan dengan kebiasaan sed
atau awk
- segera menjadi produktif.
Mode string-literal. Temukan & ganti non-regex. Tidak ada lagi garis miring terbalik atau mengingat karakter mana yang spesial dan perlu di-escape.
Mudah dibaca, mudah ditulis. Ekspresi Temukan & ganti dipisahkan, sehingga mudah dibaca dan ditulis. Tidak perlu lagi mengotak-atik tebasan yang tidak tertutup dan lolos.
Default yang cerdas dan masuk akal. Standarnya mengikuti akal sehat dan disesuaikan untuk penggunaan sehari-hari.
Meskipun sed melakukan lebih banyak hal, sd berfokus pada melakukan satu hal saja dan melakukannya dengan baik. Berikut adalah beberapa contoh pilihan di mana sd bersinar.
Sintaks yang lebih sederhana untuk mengganti semua kemunculan:
sd before after
sed s/before/after/g
Ganti baris baru dengan koma:
sd 'n' ','
sed ':a;N;$!ba;s/n/,/g'
Mengekstrak sesuatu dari string yang mengandung garis miring:
sd: echo "sample with /path/" | sd '.*(/.*/)' '$1'
sed: echo "sample with /path/" | sed -E 's/.*(\/.*\/)/1/g'
Dengan sed, Anda dapat membuatnya lebih baik dengan pembatas yang berbeda, namun masih berantakan:
echo "sample with /path/" | sed -E 's|.*(/.*/)|1|g'
Di tempat modifikasi file:
sd: sd before after file.txt
sed: sed -i -e 's/before/after/g' file.txt
Dengan sed, Anda harus ingat untuk menggunakan -e
atau beberapa platform akan menganggap argumen berikutnya sebagai sufiks cadangan.
Penggantian sederhana pada ~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 '
Memerintah | Cara] | Min… Maks [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 |
Hasil: ~2,35 kali lebih cepat
Penggantian regex pada file json ~55 juta :
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 '
Memerintah | Cara] | Min… Maks [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 |
Hasil: ~11,93 kali lebih cepat
Instal melalui cargo
dengan cargo install sd
, atau melalui berbagai pengelola paket
Mode string-literal . Secara default, ekspresi diperlakukan sebagai regex. Gunakan -F
atau --fixed-strings
untuk menonaktifkan regex.
> echo ' lots((([]))) of special chars ' | sd -F ' ((([]))) ' ' '
lots of special chars
Penggunaan regex dasar - mari kita pangkas beberapa spasi tambahan
> echo ' lorem ipsum 23 ' | sd ' s+$ ' ' '
lorem ipsum 23
Tangkap kelompok
Grup penangkapan yang diindeks:
> echo ' cargo +nightly watch ' | sd ' (w+)s++(w+)s+(w+) ' ' cmd: $1, channel: $2, subcmd: $3 '
cmd: cargo, channel: nightly, subcmd: watch
Grup penangkapan yang diberi nama:
> echo " 123.45 " | sd ' (?P<dollars>d+).(?P<cents>d+) ' ' $dollars dollars and $cents cents '
123 dollars and 45 cents
Jika Anda menemukan ambiguitas, selesaikan dengan menggunakan ${var}
alih-alih $var
. Berikut ini contohnya:
> 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
Temukan & ganti dalam file
> sd ' window.fetch ' ' fetch ' http.js
Itu saja. File tersebut dimodifikasi di tempat.
Untuk melihat pratinjau perubahan:
> sd -p ' window.fetch ' ' fetch ' http.js
Temukan & ganti di seluruh proyek
Contoh ini menggunakan fd.
Filosofi unix yang bagus untuk menyelamatkan.
fd --type file --exec sd ' from "react" ' ' from "preact" '
Sama, tetapi dengan cadangan (pertimbangkan kontrol versi).
fd --type file --exec cp {} {}.bk ; --exec sd ' from "react" ' ' from "preact" '
sd akan menafsirkan setiap argumen yang dimulai dengan -
sebagai tanda (yang mungkin tidak diketahui). Konvensi umum penggunaan --
untuk menandakan akhir dari bendera dipatuhi:
$ 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
Untuk keluar dari karakter $
, gunakan $$
:
❯ echo " foo " | sd ' foo ' ' $$bar '
$bar