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

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

[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

1 ответ

Решение

IIRC -i переключатель является расширением к оригиналу sed и, вероятно, поэтому реализовано немного по-разному в разных версиях. BSD sed в отличие от GNU sed требует от вас явно использовать -e переключиться, чтобы обозначить вашу команду при использовании -i переключатель.

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

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

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

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

Другие вопросы по тегам