sd - 直感的な検索と置換 CLI チートシート
sd は Rust で書かれた高速な検索と置換コマンドラインツールで、一般的な場合をシンプルにするように設計されています。sed は暗号的な構文、脆弱なエスケープ、BSD/GNU 差分がある場合、sd は直前の正規表現 (またはリテラル文字列)、明白なキャプチャグループ参照 ($1)、および安全なファイルの読み込み/書き込みを使用します。日々の「これらのファイル全体でXをYに置換」タスクでは、sed より正しく取得するのがはるかに簡単です。
インストール
| プラットフォーム | コマンド |
|---|
| Cargo (すべてのプラットフォーム) | cargo install sd |
| macOS (Homebrew) | brew install sd |
| Arch Linux | sudo pacman -S sd |
| Debian/Ubuntu | sudo apt install sd |
| Fedora | sudo dnf install sd |
| 確認 | sd --version |
基本的な使用
sdは stdin またはファイルを読み込みます。形式は sd FIND REPLACE [FILES...] です。
| コマンド | 説明 |
|---|
| `echo “hello” | sd hello world` |
sd 'before' 'after' file.txt | ファイルで置換 (インプレース) |
sd 'before' 'after' *.txt | 多くのファイル全体で置換 |
sd --help | 完全なオプションリスト |
リテラル対 Regex
| コマンド | 動作 |
|---|
sd 'a.b' 'X' file | Regex:. は任意の文字にマッチ |
sd -s 'a.b' 'X' file | リテラル文字列 (-s/--string-mode) |
sd '\d+' 'N' file | Regex 数字クラス |
検索テキストが regex メタキャラクターを含み、リテラルとして扱いたい場合は -s を使用 — 手動エスケープなし。
キャプチャグループ
sd はシンプルな $1、$2 参照を使用します (テキストに隣接する場合 ${1} )。
# 「First Last」→「Last, First」をスワップ
echo "Ada Lovelace" | sd '(\w+) (\w+)' '$2, $1'
# → Lovelace, Ada
# YYYY-MM-DD → DD/MM/YYYY 日付をリフォーマット
sd '(\d{4})-(\d{2})-(\d{2})' '$3/$2/$1' dates.txt
# グループが数字/文字に続く場合は括弧を使用
echo "v2" | sd 'v(\d)' 'version${1}0' # → version20
キーオプション
| オプション | 説明 |
|---|
-s, --string-mode | FIND/REPLACE をリテラル文字列として扱う |
-p, --preview | 書き込みなしで差分/結果を表示 |
-f, --flags FLAGS | Regex フラグ:i (大文字小文字区別なし)、m、s、等 |
-n, --max-replacements N | 置換数を制限 |
| stdin/stdout | ファイルを省略してフィルターとして動作 |
Regex フラグ (-f)
| フラグ | 効果 |
|---|
i | 大文字小文字区別なし |
m | マルチラインn (^/$ ラインボーダーをマッチ) |
s | ドットが改行をマッチ |
w | 単語全体をマッチ |
# 大文字小文字区別なし置換
sd -f i 'error' 'ERROR' log.txt
安全なプレビュー
# ファイルにタッチする前に何が変わるかを確認
sd -p 'foo' 'bar' src/*.rs
# その後適用
sd 'foo' 'bar' src/*.rs
一般的なワークフロー
# コードベース全体でシンボルをリネーム (最初にプレビュー)
sd -p 'oldFunctionName' 'newFunctionName' **/*.js
sd 'oldFunctionName' 'newFunctionName' **/*.js
# 末尾の空白を削除
sd ' +$' '' file.txt
# リテラルパスを置換 (文字列モードはドット/スラッシュのエスケープを回避)
sd -s './old/path.js' './new/path.js' config.json
# チェーン内のパイプ使用
cat access.log | sd '\d+\.\d+\.\d+\.\d+' '[REDACTED_IP]'
sd 対 sed
| 側面 | sd | sed |
|---|
| 構文 | シンプル、最新 regex | 簡潔、履歴的 |
| キャプチャ参照 | $1, $2 | \1, \2 |
| リテラルモード | -s (エスケープなし) | 手動エスケープ |
| インプレース | ファイルのデフォルト | -i (BSD/GNU 異なる) |
| ストリーミング編集 (sed スタイル) | 置換に焦点 | 完全なストリームエディター |
sd は焦点を絞った検索と置換;置換を超えたストリーム編集には sed/awk が適用。検索 (置換ではなく) には ripgrep とペア。
リソース