sed でスラッシュを含む文字列を置換したい

sed コマンドでスラッシュ / を含む文字列を置換したくなった。

普通にやるなら、文字列中のスラッシュを \/ とエスケープしてやれば良い。

$ echo 'hoge/fuga' | sed 's/e\/f/E-And-F/'

hogE-And-Fuga

しかし、別の変数から値を拾って使用したりする時に、イチイチエスケープするのは面倒だ。

そこで調べてみると、sed コマンドの区切り文字はスラッシュ以外の記号でも動くことが分かった。スラッシュ以外の区切り文字を使用すれば、置換文字列中のスラッシュはエスケープが不要になる。

色々試したが、別にアルファベットを区切り文字にしていてもよくて、置換文字列内に登場しない1文字を使っていれば良いみたい。

# 区切り文字にアットマーク `@` を使う例
echo 'hoge/fuga' | sed s@e/f@E-And-F@

# 区切り文字に `X` を使った例
$ echo 'hoge/fuga' | sed sXe/fXE-And-FX

# 特殊な文字を使う時はきちんとクォートで囲もう。「bash: syntax error near unexpected token `('」
$ echo 'hoge/fuga' | sed 's(e/f(E-And-F('

いずれも上手く動く。

アットマーク @、エクスクラメーションマーク ! などは、この仕様を知らない人が見ても区切り文字と認識しやすいと思う。シャープ # はコメントと勘違いされそうだし、クォートが必要な記号文字は少々怖いかな。

ひとまずコレでよき。