23个版本 (1个稳定版)
1.0.0 | 2023年11月8日 |
---|---|
0.7.6 | 2020年8月1日 |
0.7.5 | 2020年5月4日 |
0.7.2 | 2020年3月31日 |
0.4.0 | 2018年12月30日 |
##37 in 文本处理
16,498 每月下载量
用于 michie
42KB
875 行
sd - s
earch & d
isplace
sd
是一个直观的查找和替换命令行界面。
简介
为什么选择它而不是现有的工具呢?
无痛苦的正则表达式。 sd
使用您从 JavaScript 和 Python 已知的正则表达式语法。忘记处理 sed
或 awk
的怪癖 - 立即变得高效。
字符串字面量模式。 非正则查找和替换。不再需要反斜杠或记住哪些字符是特殊的并需要转义。
易于阅读,易于编写。 查找和替换表达式被分割,这使得它们易于阅读和编写。不再需要处理未关闭的转义斜杠。
智能,常识默认值。 默认值遵循常识,并针对典型日常使用进行了定制。
与sed的比较
虽然sed可以做很多事情,但sd专注于只做一件事,并且做得很好。以下是一些sd出色的精选示例。
替换所有出现的简单语法
- sd:
sd before after
- sed:
sed s/before/after/g
将换行符替换为逗号
- sd:
sd '\n' ','
- sed:
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.5GB的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] | 最小…最大 [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+):\1\1:g" dump.json > /dev/null' \
'sed "s:\(\w\+\):\1\1:g" dump.json > /dev/null' \
'sd "(\w+)" "$1$1" dump.json > /dev/null'
命令 | 平均值 [s] | 最小…最大 [s] |
---|---|---|
sed-E"s:(\w+):\1\1:g"dump.json> /dev/null |
11.315 ± 0.215 | 11.102…11.725 |
sed"s:\(\w\+\):\1\1: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 -s '((([])))' '' 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
依赖
~6–16MB
~223K SLoC