SED不能使用复杂的string

我有一个像这样开始的文件:

[global] pid = /var/run/php-fpm/php-fpm.pid error_log = /var/log/php5-fpm.log 

并想要更换

error_log = /var/log/php5-fpm.log

error_log = /var/log/php-fpm/error.log

我想为此使用一个脚本,并执行以下操作:

 search='error_log = /var/log/php5-fpm.log' replace='error_log = /var/log/php-fpm/error.log' for file in `find -name 'php-fpm.conf'`; do grep "$search" $file &> /dev/null if [ $? -ne 0 ]; then echo "Search string not found in $file!" else sed -i "s#$search#$replace#" $file fi done 

这引发了这个错误:

 sed: -e expression #1, char 0: no previous regular expression sed: -e expression #1, char 0: no previous regular expression 

IIRC -i开关是对原始sed的扩展,因此可能在不同的版本中稍有不同。 与GNU sed不同, BSD sed要求您在使用-i开关时明确使用-e开关来表示您的命令。

使用:

sed -i -e "s#$search#$replace#" $file

正如已经暗示你的错误信息。

编写真正可移植的脚本是一个PITA,当这样的细节反对你。