У меня есть файл, который начинается так:
[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: предыдущего регулярного выражения нет
IIRC переключатель -i
является расширением исходного sed
и, вероятно, поэтому реализован немного по-разному в разных версиях. BSD sed
в отличие от GNU sed
требует, чтобы вы явно использовали переключатель -e
для обозначения вашей команды при использовании -i
переключатель.
Используйте:
sed -i
-e
"s # $ search # $ replace #" $ file
, как уже упоминалось в вашем сообщении об ошибке.
Написание действительно переносимых сценариев - это PITA, когда подобные детали сговариваются против вас.