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

如何通过sedperl单行内存执行此操作?

其他选项只是添加行:

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

后行:

 #archive_command = '' 

您可以使用类似下面的命令来replace包含注释的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选项进行就地更新。

你可以像在@Khaled答案中看到的那样使用sed ,但是最好的方法是使用像ansiblechefpuppet这样的configurationpipe理工具。

我将使用由configurationpipe理完全pipe理的模板,而不是执行search和replace。 我只会使用search和replace,只要我希望文件被另一个configurationpipe理或其他用户更改。

大多数脚本的问题在于它们不是被devise为幂等的。 如果您需要再次更改该参数,则需要更改脚本。 你可以写sed expresion是幂等的,但是这需要更多的努力。