#regex #replace #sed #find

app sd

直观的查找和替换命令行界面

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 文本处理

Download history 1246/week @ 2024-04-08 1698/week @ 2024-04-15 2576/week @ 2024-04-22 2256/week @ 2024-04-29 2040/week @ 2024-05-06 1823/week @ 2024-05-13 1693/week @ 2024-05-20 1779/week @ 2024-05-27 3432/week @ 2024-06-03 2833/week @ 2024-06-10 3836/week @ 2024-06-17 2840/week @ 2024-06-24 3837/week @ 2024-07-01 3510/week @ 2024-07-08 3766/week @ 2024-07-15 5030/week @ 2024-07-22

16,498 每月下载量
用于 michie

MIT 许可证

42KB
875

sd - search & displace

sd 是一个直观的查找和替换命令行界面。

简介

为什么选择它而不是现有的工具呢?

无痛苦的正则表达式。   sd 使用您从 JavaScript 和 Python 已知的正则表达式语法。忘记处理 sedawk 的怪癖 - 立即变得高效。

字符串字面量模式。   非正则查找和替换。不再需要反斜杠或记住哪些字符是特殊的并需要转义。

易于阅读,易于编写。   查找和替换表达式被分割,这使得它们易于阅读和编写。不再需要处理未关闭的转义斜杠。

智能,常识默认值。   默认值遵循常识,并针对典型日常使用进行了定制。

与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,或者通过各种包管理器

Packaging status

快速指南

  1. 字符串字面量模式。默认情况下,表达式被视为正则表达式。使用-F--fixed-strings来禁用正则表达式。

    > echo 'lots((([]))) of special chars' | sd -s '((([])))' ''
    lots of special chars
    
  2. 基本正则表达式使用 - 剪除一些尾随空格

    > echo 'lorem ipsum 23   ' | sd '\s+$' ''
    lorem ipsum 23
    
  3. 捕获组

    索引捕获组

    > 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
    
  4. 在文件中查找和替换

    > sd 'window.fetch' 'fetch' http.js
    

    就是这样。文件已原地修改。

    要预览更改

    > sd -p 'window.fetch' 'fetch' http.js
    
  5. 跨项目查找和替换

    此示例使用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