s
搜尋與d
sd
是一個直覺的尋找和替換 CLI。
為什麼要使用它而不是任何現有工具?
無痛的正規表示式。 sd
使用您已從 JavaScript 和 Python 中了解的正規表示式語法。忘記處理sed
或awk
的怪癖 - 立即提高工作效率。
字串文字模式。非正規表示式查找和取代。不再需要反斜線或記住哪些字元是特殊的並且需要轉義。
易讀,易寫。尋找和取代表達式被分開,這使得它們易於閱讀和編寫。不再弄亂未閉合和轉義的斜線。
聰明、常識的預設值。預設值遵循常識,並針對典型的日常使用量身定制。
雖然 sed 可以做更多的事情,但 sd 專注於只做一件事並把它做好。以下是精選的一些 sd 表現出色的範例。
用於替換所有出現的更簡單的語法:
sd before after
sed s/before/after/g
用逗號替換換行符號:
sd 'n' ','
sed ':a;N;$!ba;s/n/,/g'
從包含斜杠的字串中提取內容:
sd: echo "sample with /path/" | sd '.*(/.*/)' '$1'
sed: echo "sample with /path/" | sed -E 's/.*(\/.*\/)/1/g'
使用 sed,您可以使用不同的分隔符號使其變得更好,但它仍然很混亂:
echo "sample with /path/" | sed -E 's|.*(/.*/)|1|g'
就地修改文件:
sd: sd before after file.txt
sed: sed -i -e 's/before/after/g' file.txt
使用 sed,您需要記住使用-e
,否則某些平台會將下一個參數視為備份後綴。
簡單替換約 1.5 GB 的 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 '
命令 | 方法] | 最小…最大 [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 |
結果:快約 2.35 倍
約 55M json 檔案的正規表示式替換:
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 '
命令 | 方法] | 最小…最大 [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 |
結果:約快 11.93 倍
透過cargo
cargo install sd
或透過各種套件管理器安裝
字串文字模式。預設情況下,表達式被視為正規表示式。使用-F
或--fixed-strings
停用正規表示式。
> echo ' lots((([]))) of special chars ' | sd -F ' ((([]))) ' ' '
lots of special chars
基本正規表示式使用- 讓我們修剪一些尾隨空格
> echo ' lorem ipsum 23 ' | sd ' s+$ ' ' '
lorem ipsum 23
捕獲組
索引捕獲組:
> echo ' cargo +nightly watch ' | sd ' (w+)s++(w+)s+(w+) ' ' cmd: $1, channel: $2, subcmd: $3 '
cmd: cargo, channel: nightly, subcmd: watch
命名捕獲組:
> echo " 123.45 " | sd ' (?P<dollars>d+).(?P<cents>d+) ' ' $dollars dollars and $cents cents '
123 dollars and 45 cents
萬一您偶然發現歧義,請使用${var}
而不是$var
來解決它們。這是一個例子:
> 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
在文件中尋找並替換
> sd ' window.fetch ' ' fetch ' http.js
就是這樣。該文件已就地修改。
要預覽更改:
> sd -p ' window.fetch ' ' fetch ' http.js
跨項目尋找和替換
本例使用 fd.
好的 Unix 哲學可以拯救你。
fd --type file --exec sd ' from "react" ' ' from "preact" '
相同,但有備份(考慮版本控制)。
fd --type file --exec cp {} {}.bk ; --exec sd ' from "react" ' ' from "preact" '
sd 會將每個以-
開頭的參數解釋為(可能未知的)標誌。遵循使用--
表示標誌結束的常見約定:
$ 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
若要轉義$
字符,請使用$$
:
❯ echo " foo " | sd ' foo ' ' $$bar '
$bar