实现典型的变量扩展时,Sed操作失败$ {domain}

时间:2017-12-04 00:44:54

标签: php bash sed replace

请考虑以下代码:

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操作中看不到任何要逃避的内容,并且没有错误。

2 个答案:

答案 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}'

用双引号替换单引号,然后重试。