Заменить одну строку (подстроку) в файле другой строкой (подстрокой) можно командой:
sed -i "s/abc/xyz/g" "/path/to/file.php"
В данном случае выражение abc будет заменено на xyz.
Добавим предварительное условие нахождения данной строки (подстроки) в файле:
grep "abc" "/path/to/file.php" && sed -i "s/abc/xyz/g" "/path/to/file.php"
Таким образом, замена будет выполнена только при нахождении в файле строки abc.
Можно также добавить выполнение чего-либо при отсутствии строки (подстроки) «abc» в файле:
grep "abc" "/path/to/file.php" && sed -i "s/abc/xyz/g" "/path/to/file.php" || echo "Строка не найдена"
Мне это пригодилось для мониторинга изменений в конфигурационном файле WordPress и автоматической замены нужного параметра (WordPress при обновлении зачем-то вновь включает создание ревизий, поэтому пришлось мониторить значение параметра WP_POST_REVISIONS
в файле default-constants.php и при значении true
заменять его на false
):
grep "define('WP_POST_REVISIONS', true);" "/path/to/site/wp-includes/default-constants.php" && sed -i "s/define('WP_POST_REVISIONS', true)/define('WP_POST_REVISIONS', false)/g" "/path/to/site/wp-includes/default-constants.php"
Для автоматического мониторинга я включил это задание в крон (crontab -e
) на ежечасное выполнение:
@hourly grep "define('WP_POST_REVISIONS', true);" "/path/to/site/wp-includes/default-constants.php" && sed -i "s/define('WP_POST_REVISIONS', true)/define('WP_POST_REVISIONS', false)/g" "/path/to/site/wp-includes/default-constants.php"