新一代命令行工具的特点是语法简单,符合直觉。他们大多使用 rust 或者 go 编写。
sd
sd 可以替代 sed。sd 是使用 rust 编写的,所以使用的正则引擎和你在 JS 和 Python 中熟悉的正则引擎是一致的,也就不需要各种奇奇怪怪的转义了。sd 还具有字符串模式,也就是关闭正则表达式,这也避免了一些转义的工作量。
安装
# 首先安装 rust,如果没有安装的话 ~$ curl https://sh.rustup.rs -sSf |sh ~$ cargo install sd
使用
# 和 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 命令则好了,没有什么复杂的,基本上按照直觉敲出来就对了。
安装
brew install fd # homebrew/linuxbrew 或者 cargo install fd-find # 首先需要安装 rust,如前文所述
使用
# 查找包含 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 更省心一点,默认主题也更漂亮一点。
安装
brew install bat
使用
直接用就好了。。建议 aliascat=bat
sk 和 fzf
sk 和 fzf 是两个模糊搜索工具,分别使用 rust 和 go 编写,两个的功能比较接近,这里以我日常使用的 fzf 为例。