Linuxメモ : Rust製のsdコマンド(sedの代替)を試してみる
sd
Rust製のsd
コマンドはsed
コマンドの代わりとして使えそうなコマンド。
直感的に書けることと高速なのが特徴とのこと。
インストール
各環境でのインストール方法はこのページに書いてある。
バイナリはこのページからダウンロードでき、 Rust製なのでcargo installでインストールできる。
$ cargo install sd
ヘルプメッセージ。
$ sd -h sd 0.5.0 USAGE: sd [OPTIONS] <find> <replace_with> [files]... OPTIONS: -f, --flags <flags> Regex flags. May be combined (like `-f mc`). c - case-sensitive m - multi-line matching i - case-insensitive Smart-case is enabled by default. -h, --help Prints help information -i, --in-place Modify the files in-place. Otherwise, transformations will be emitted to STDOUT by default. -s, --string-mode Treat expressions as non-regex strings. ARGS: <find> The regexp or string (if -s) to search for. <replace_with> What to replace each match with. Unless in string mode, you may use captured values like $1, $2, etc. <files>... The path to file(s). This is optional - sd can also read from STDIN.
使い方
基本的な使い方は以下の通り。
$ cat test.txt abcABCabcABC $ sed s/abc/012/g test.txt 012ABC012ABC $ sd abc 012 test.txt 012012012012
デフォルトではsmart caseでマッチするので、大文字小文字を区別する/区別しないは下記オプションを指定する。
$ sd -f c abc 012 test.txt 012ABC012ABC $ sd -f i ABC 012 test.txt 012012012012
ファイルを上書きする場合は-i
オプションが使える。
$ cat test.txt abcABCabcABC $ sd -i abc 012 test.txt $ cat test.txt 012012012012
正規表現を使うこともでき、
$ echo 'abc ' | sd '\s+$' '' abc
-s
オプションを指定すると正規表現を無効にできる。
$ echo 'abc((([])))' | sd -s '((([])))' '' abc
その他、Readmeに書いてあったサンプルとしてはキャプチャグループや、
$ echo 'cargo +nightly watch' | sd '(\w+)\s+\+(\w+)\s+(\w+)' 'cmd: $1, channel: $2, subcmd: $3' cmd: cargo, channel: nightly, subcmd: watch
fd
コマンドと組み合わせた一括置換の方法など。
for file in $(fd -t f); do cp "$file" "$file.bk" sd -i 'from "react"' 'from "preact"' "$file"; done