Назад | Перейти на главную страницу

SED не работает со сложной строкой

У меня есть файл, который начинается так:

[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 и, вероятно, поэтому в разных версиях реализован немного по-разному. BSD sed в отличие GNU sed требует, чтобы вы явно использовали -e переключатель для обозначения вашей команды при использовании -i переключатель.

Использование:

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

как уже было указано в вашем сообщении об ошибке.

Написание действительно переносимых сценариев - это PITA, когда подобные детали сговариваются против вас.