请考虑以下代码:
read domain
> old-domain.com
然后:
sed -i 's/${domain}/new-domain.com'/g /var/www/html/test/wp-config.php
sed
操作失败 - wp-config.php文件中$ {domain}的所有实例都不会发生更改...例如,以下代码不会更改:
define('DB_NAME','old-domain.com');
换句话说,在old-domain.com
操作之后,${domain}
(在new-domain.com
中表示)不会更改为sed
。那是为什么?
注意:我在sed
操作中看不到任何要逃避的内容,并且没有错误。
答案 0 :(得分:2)
请注意,此命令不执行任何操作:
$ sed 's/${domain}/new-domain.com'/g wp-config.php
define('DB_NAME', 'old-domain.com');
但是这个命令有效:
$ sed "s/${domain}/new-domain.com"/g wp-config.php
define('DB_NAME', 'new-domain.com');
添加-i
选项以更改文件。
问题是shell(包括bash)在单引号内时不会扩展变量。如果切换到双引号,您的命令将起作用。
请注意,如果$domain
包含sed-active字符,您可能会收到令人惊讶甚至危险的结果。因此,请不要使用此功能,除非您确信将为domain
分配哪些值。
考虑使用awk如下:
$ awk -v old="${domain}" '{gsub(old, "new-domain.com")} 1' wp-config.php
define('DB_NAME', 'new-domain.com');
当像这样运行时,awk会将$doman
视为数据而不是代码,这避免了sed方法的许多潜在缺陷。
如果您有GNU awk,则可以使用以下内容更改文件:
awk -i inplace -v old="${domain}" '{gsub(old, "new-domain.com")} 1' wp-config.php
或者,对于任何awk,请使用:
awk -v old="${domain}" '{gsub(old, "new-domain.com")} 1' wp-config.php >tmp && mv tmp wp-config.php
答案 1 :(得分:1)
在bash
中,单引号和双引号字符串之间存在差异:仅在双引号字符串中,环境变量才会扩展。
试一试:
$ echo "${USER}"
$ echo '${USER}'
用双引号替换单引号,然后重试。