s
とd
sd
直感的な検索と置換の CLI です。
既存のツールではなくそれを使用する理由は何ですか?
痛みのない正規表現。 sd
JavaScript や Python ですでに知られている正規表現構文を使用します。 sed
やawk
の癖に対処することは忘れて、すぐに生産性を高めましょう。
文字列リテラル モード。非正規表現の検索と置換。バックスラッシュを使用したり、どの文字が特別でエスケープする必要があるのかを覚えたりする必要はもうありません。
読みやすく、書きやすい。検索と置換の式は分割されているため、読み取りと書き込みが簡単になります。閉じられていないスラッシュやエスケープされたスラッシュをいじる必要はもうありません。
賢明で常識的なデフォルト。デフォルトは常識に従い、一般的な日常使用に合わせて調整されています。
sed はさらに多くのことを実行しますが、sd は 1 つのことだけを実行し、それを適切に実行することに重点を置いています。ここでは、SD が輝くいくつかの厳選した例を紹介します。
すべての出現箇所を置換するためのより単純な構文:
sd before after
sed s/before/after/g
改行をカンマに置き換えます。
sd 'n' ','
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.5 ギガバイトの 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 '
指示 | 手段] | 最小…最大 [秒] |
---|---|---|
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+):11:g" dump.json > /dev/null '
' sed "s:(w+):11:g" dump.json > /dev/null '
' sd "(w+)" "$1$1" dump.json > /dev/null '
指示 | 手段] | 最小…最大 [秒] |
---|---|---|
sed -E "s:(w+):11:g" dump.json > /dev/null | 11.315±0.215 | 11.102…11.725 |
sed "s:(w+):11: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 install sd
を使用してcargo
を通じてインストールするか、さまざまなパッケージ マネージャーを通じてインストールします。
文字列リテラル モード。デフォルトでは、式は正規表現として扱われます。正規表現を無効にするには、 -F
または--fixed-strings
使用します。
> echo ' lots((([]))) of special chars ' | sd -F ' ((([]))) ' ' '
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
名前付きキャプチャ グループ:
> 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
ファイル内の検索と置換
> sd ' window.fetch ' ' fetch ' http.js
それでおしまい。ファイルはその場で変更されます。
変更をプレビューするには:
> sd -p ' window.fetch ' ' fetch ' http.js
プロジェクト全体での検索と置換
この例では 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