如何使用sed添加新选项或更新配置文件的选项值

时间:2016-09-22 09:16:50

标签: shell sed sh

我使用sed更新配置文件,如果密钥不存在,添加键值,否则更新值

sed 's/^x=.*/x=z/;t;/\[options\]/ax=z' <<< '[options]'
sed 's/^x=.*/x=z/;t;/\[options\]/ax=z' <<< '[options]
x=y'

期望相同的输出:

[options]
x=z

但是最后一个命令输出:

[options]
x=z
x=z

cuz sed逐行处理文件,如何让它正常工作? ?

2 个答案:

答案 0 :(得分:1)

sed不适合这份工作。 Perl救援:

#!/usr/bin/perl
use warnings;
use strict;

use Config::INI::Reader;
use Config::INI::Writer;

my $file = shift;

my $config = 'Config::INI::Reader'->read_file($file);
$config->{options}{x} = 'z';

rename $file, "$file~";
'Config::INI::Writer'->write_file($config, $file);

有关如何处理INI文件的详细信息,请参阅Config::INI

答案 1 :(得分:0)

您的命令问题是,您的第一个sed替换用x=z替换x=y,然后在x=z之后追加[options]

要获得所需的输出,您需要颠倒顺序。所以

sed 's/\[options\]/x=z/;t;/^x=.*/ax=z' <<< '[options]
x=y'`

将为您提供所需的输出