bashで文字列置換をする

shでの文字列置換はやった記憶がない。sedと組み合わせる印象はあった。

sedの遅さ(重さ)については、参考ページで数値化してくださっている。数百倍遅いとのこと。
参考ページ)
https://qiita.com/ko1nksm/items/b4b342f77f6d3ee1a0a9

bashでは正規表現の置換ができる。

aaaをcccに置換するとき、

DATA="aaa,bbb,aaa"
echo "${DATA/aaa/ccc}"

結果
ccc,bbb,aaa

最初にマッチした1つしか置換しないようだ。

全部置換するには、スラッシュを2個つける。

DATA="aaa,bbb,aaa"
echo "${DATA//aaa/ccc}"

結果
ccc,bbb,ccc

下記の例で、linux系のパスのディレクトリ部分だけ取り出して、Windows向けにスラッシュを円記号に変える処理。
dirnameと basenameも使い方(どっちだっけ?)をすぐ忘れてしまう。

path='aaa/bbb/ccc/test.html'
dir=`dirname $path`
file=`basename $path`

echo "dir:${dir}"
echo "file:${file}"

echo "dir(win):¥${dir//\//¥}" # すべて置換

結果
dir:aaa/bbb/ccc
file:test.html
dir(win):¥aaa¥bbb¥ccc

期待通りに動いた。スラッシュ(/)にエスケープのためのバックスラッシュ(\)をつけている。

CentOS系では、「shはbashのシンボリックリンクである」という情報を見かけた。

MacOSはBSD系らしいが、シンボリックリンクにはなっておらず、バイナリのサイズが違った。

Screenshot

しかし、上記の文字列置換のbash記述を/bin/shとしても問題なく実行できた。