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 выражение # 1, char 0: предыдущее регулярное выражение отсутствует
sed: -e выражение # 1, char 0: предыдущего регулярного выражения нет
0
задан 22 June 2017 в 13:08
1 ответ

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

Используйте:

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

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

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

1
ответ дан 4 December 2019 в 16:13

Теги

Похожие вопросы