ディレクトリを再帰的に検索して置き換えて、ある文字列を別の文字列に変更する単純なbash関数を作成しようとしています。これが私が得るものです:
function sar () {
from="$1"
shift
to="$1"
shift
if [[ $from == '' || $to == '' ]]
then
echo Usage: sar \<from\> \<to\> \<filename\>
return
fi
while [[ $# -gt 0 ]]
do
filename="$1"
shift
find ./$filename -type f -exec sed -i -e 's/$from/$to/g' {} \;
done
}
たとえば、
$ sar xxxx yyyy mydir
./mydirで実行しfind
てアクセスするすべてのファイルでxxxxをyyyyに置き換える必要があります。コマンドはエラーなしで実行されますが、置換は実行されません。
でset -x
実行
+ find ./mydir -type f -exec sed -i -e 's/$from/$to/g' '{}' ';'
$from
解決されて$to
おらず、いくつかの追加の参照が表示されました。
bash関数でこのコマンドを書く正しい方法は何ですか(bashスクリプトと同じ構文規則に従うとします)。
ベストアンサー1
一重引用符内に変数を入れても拡張されないため、二重引用符を使用する必要があります。
... sed -i -e "s/$from/$to/g" ...