我使用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逐行处理文件,如何让它正常工作? ?
答案 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'`
将为您提供所需的输出