新一代命令行工具的特点是语法简单,符合直觉。他们大多使用 rust 或者 go 编写。
sd
sd 可以替代 sed。sd 是使用 rust 编写的,所以使用的正则引擎和你在 JS 和 Python 中熟悉的正则引擎是一致的,也就不需要各种奇奇怪怪的转义了。sd 还具有字符串模式,也就是关闭正则表达式,这也避免了一些转义的工作量。
安装
代码语言:javascript复制# 首先安装 rust,如果没有安装的话
~$ curl https://sh.rustup.rs -sSf | sh
~$ cargo install sd
使用
代码语言:javascript复制# 和 sed 的对比:
sd: sd before after
sed: sed s/before/after/g
# 字符串模式, -s 开启,可以看到括号就是括号
> 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
# 替换文件,使用 -i
> sd 'window.fetch' 'fetch' -i http.js
fd
fd 可以用来替代 find。和 sed 一样,find 命令也使用了一些古老的正则语法,要查找含有某个字的文件,或者过滤某个类型的文件都要使用一些比较难以记忆的通配符。fd 命令则好了,没有什么复杂的,基本上按照直觉敲出来就对了。
安装
代码语言:javascript复制brew install fd # homebrew/linuxbrew
或者
cargo install fd-find # 首先需要安装 rust,如前文所述
使用
代码语言:javascript复制# 查找包含 name 的文件
-> % find . -name "*hello*"
./courses/hello_world.go
./courses/chapter_01/hello_world.go
./courses/chapter_01/hello_world
./examples/01_hello_world.go
# 相比之下 fd 则简单多了
-> % fd hello
courses/chapter_01/hello_world
courses/chapter_01/hello_world.go
courses/hello_world.go
examples/01_hello_world.go
# 查找 markdown 类型的文件
-> % find . -name "*.md"
./courses/chapter_01/chapter_1.md
./courses/chapter_1.md
-> % fd -e md
courses/chapter_01/chapter_1.md
courses/chapter_1.md
# 使用 exec,这是我对 find 命令最不满意的地方,结尾的分号实在费解
-> % find . -name "*.md" -exec wc -l {} ;
114 ./courses/chapter_01/chapter_1.md
114 ./courses/chapter_1.md
-> % fd -e md --exec wc -l {}
114 courses/chapter_1.md
114 courses/chapter_01/chapter_1.md
bat
bat 是个带了高亮和git集成版的 cat。虽说按照 Unix 哲学的话 cat|highlight
命令也能实现类似的功能,但是还是 bat 更省心一点,默认主题也更漂亮一点。
安装
代码语言:javascript复制brew install bat
使用
直接用就好了。。建议 aliascat=bat
sk 和 fzf
sk 和 fzf 是两个模糊搜索工具,分别使用 rust 和 go 编写,两个的功能比较接近,这里以我日常使用的 fzf 为例。
还有几个工具,有点困了,下次再写。。
Ref
- https://github.com/chmln/sd
- https://github.com/sharkdp/fd
- https://www.wezm.net/technical/2019/10/useful-command-line-tools/
- https://boyter.org/posts/my-list-of-useful-command-line-tools/
- https://github.com/lotabout/skim#difference-to-fzf