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系らしいが、シンボリックリンクにはなっておらず、バイナリのサイズが違った。
しかし、上記の文字列置換のbash記述を/bin/shとしても問題なく実行できた。