web-dev-qa-db-ja.com

sedコマンドが対話的に機能するのにスクリプトでは機能しないのはなぜですか?

SEDコマンドは、Debianのbashでは置き換えられませんが、コマンドラインでは機能します。

コマンドラインで機能:

sed -i 's|/dev/disk/by-label/SR6D4|/dev/disk/by-label/SR4D4|g' /etc/my/config.xml

bashスクリプトでは機能せず、文字列を置き換えません:

from="SR6D4"
to="SR4D4"
path_from="/dev/disk/by-label/${from}"
path_to="/dev/disk/by-label/${to}"
echo "sed -i 's|${path_from}|${path_to}|g' $file"
sed -i 's|${path_from}|${path_to}|g' $file

Bashでsedを使用するときにファイルの文字列を置き換えないのはなぜですか?

2
klor

シェル変数は一重引用符で展開されません。 (一重引用符の目的の一種です。)

sed -i "s|${path_from}|${path_to}|g" "$file"

よりよく機能するはずです。 (ファイル名にスペースが含まれる場合に備えて、$fileの前後に二重引用符を追加しました。)

4
Ulrich Schwarz