残念ながら、sed は、sed とシェルにとって「特別な」さまざまな文字を含む可能性のある変数を確実に処理できません。これには awk を使用する必要があります。たとえば、gensub() には GNU awk を使用します。
gawk -v pass="$PASS" '{$0=gensub(/(\[\047password\047] = \")/,"\\1"pass,"g")}1' file
PASS にスラッシュが含まれているが awk が気にしない場合に、sed がどのように失敗するかを以下で確認してください。
$ cat file
The string: ['password'] = ""; needs to be replaced
$ PASS='foo'
$ awk -v pass="$PASS" '{$0=gensub(/(\[\047password\047] = \")/,"\\1"pass,"g")}1' file
The string: ['password'] = "foo"; needs to be replaced
$ sed "s/\(\['password'\] = \"\)\(\";\)/\1$PASS\2/g" file
The string: ['password'] = "foo"; needs to be replaced
$ PASS='foo/bar'
$ awk -v pass="$PASS" '{$0=gensub(/(\[\047password\047] = \")/,"\\1"pass,"g")}1' file
The string: ['password'] = "foo/bar"; needs to be replaced
$ sed "s/\(\['password'\] = \"\)\(\";\)/\1$PASS\2/g" file
sed: -e expression #1, char 38: unknown option to `s'
単一引用符で区切られた awk スクリプト内で単一引用符を表すには、\047
またはその他の方法 (たとえば、必要に応じて)を使用する必要があります。'"'"'
gensub() を使用しない awks では、代わりに gsub() を使用します。
awk -v pass="$PASS" '{pre="\\[\047password\047] = \""; gsub(pre,pre pass)}1' file