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

Как вставить сложную строку между двумя одинарными кавычками в sed?

У меня есть эта строчка в файле /var/lib/pgsql/data/postgresql.conf:

#  archive_command = ''           # command to use to archive a logfile segment

нам нужно раскомментировать archive_command параметр и установите его значение на

'rsync -a %p barman@barman-backup-server-ip:/var/lib/barman/main-db-server/incoming/%f' 

так что ожидаемые результаты будут

archive_command = 'rsync -a %p barman@barman-backup-server-ip:/var/lib/barman/main-db-server/incoming/%f' 

Как это сделать с помощью однострочного лайнера sed или perl?

другой вариант просто добавьте строку:

archive_command = 'rsync -a %p barman@barman-backup-server-ip:/var/lib/barman/main-db-server/incoming/%f' 

после строки:

#archive_command = ''

Ты можешь использовать sed как вы можете видеть в ответе @Khaled, но лучший способ сделать это - использовать инструмент управления конфигурацией, например: ansible, chef, puppet...

Я бы использовал шаблон, который полностью управляется системой управления конфигурацией, вместо того, чтобы выполнять поиск и замену. Я бы использовал поиск и замену только в том случае, если я ожидаю, что файл будет изменен другим менеджером конфигурации или другим пользователем.

Проблема с большинством скриптов в том, что они не предназначены для идемпотентности. Если вам нужно снова изменить этот параметр, вам нужно изменить скрипт. Вы могли бы написать sed выражение быть идемпотентным, но это требует немного больше усилий.

Вы можете использовать следующую команду, чтобы заменить строку, содержащую закомментированную команду archive_command:

sed -e "s|#  archive_command = .*|archive_command = 'rsync -a %p barman@barman-backup-server-ip:/var/lib/barman/main-db-server/incoming/%f'|" /var/lib/pgsql/data/postgresql.conf

Можете добавить -i возможность обновления на месте.