如何在 sed 中的两个单引号之间插入复杂的行?

如何在 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 = ''

答案1

您可以使用如下命令来替换包含注释的 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就地更新选项。

答案2

您可以sed像@Khaled 的回答中看到的那样使用,但最好的方法是使用配置管理工具,如:ansible,,...chefpuppet

我会使用完全由配置管理管理的模板,而不是进行搜索和替换。只有当我预计文件会被另一个配置管理或其他用户更改时,我才会使用搜索和替换。

大多数脚本的问题在于它们不是幂等的。如果您需要再次更改该参数,则需要更改脚本。您可以将表达式写成sed幂等的,但这需要更多努力。

相关内容