0

sed を使用してインライン検索と置換を実行しようとしていますが、奇妙な文字が問題を引き起こしていると思います。

私のconfig.incファイルには2行が含まれています:

$GLOBALS['industry_id'] = '1';
yyyy

このような単純なものが機能し、yyyy を zzzz に置き換えます。

x="yyyy"
y="zzzz"
sed -i "s/${x}/${y}/" config.inc

しかし、このようなものは機能しません:

x="$GLOBALS['industry_id'] = '1';"
y="$GLOBALS['industry_id'] = '3';"
sed -i "s/${x}/${y}/g" config.inc

$ [ ] ' のような文字をエスケープする必要がありますか? (ただし、これも機能しません):

x="\$GLOBALS\[\'industry_id\'\] = \'1\'\;"
y="\$GLOBALS\[\'industry_id\'\] = \'3\'\;"
sed -i "s/${x}/${y}/g" config.inc

私は何が欠けていますか?

ありがとうクリス

更新: pfnuesel のおかげで、次のように動作します:

x="\\\$GLOBALS\\['industry_id'\\] = '1';"
y="$GLOBALS['industry_id'] = '3';"
sed -i "s/${x}/${y}/g" config.inc
4

1 に答える 1

1

'$' はbash(パラメータ展開) で特別な意味を持ちます。エスケープする必要があります。

$ x="\$GLOBALS['industry_id'] = '1';"

今、あなたは持っています

$ echo $x
> $GLOBALS['industry_id'] = '1';

ただし、コマンドを試しても、 (行末) には特別な意味があるsedため、まだ機能しません。また、とは で特別な意味を持っているため、それらすべてをエスケープする必要があります。エスケープ文字にも特別な意味があるため、これもエスケープする必要があります。$sed[]sed\

$ x="\\\$GLOBALS\\['industry_id'\\] = '1';"

今なら

$ echo $x
> \$GLOBALS\['industry_id'\] = '1';

つまり、特殊文字の前に 1 つのエスケープ文字$[および].

、 もまたはyも、置換される文字列で特別な意味を持たないため (置換される文字列でのみ)、これは には必要ないことに注意してください。$[]

于 2013-11-07T21:35:13.630 に答える