从块中删除一行

时间:2015-10-08 09:41:44

标签: linux perl shell awk sed

我想搜索字符串并从块中删除它。我尝试使用sedawk,但我无法弄明白。

让块像这样:

[MAIN]
one=[1]
two=[2]
three=[3]
three=[4]
three=[5]

[sub]
one=[1]
two=[2]
three=[3]
three=[4]
three=[5]

我需要进入主要区域并删除three=[4],搜索相同的内容。

3 个答案:

答案 0 :(得分:3)

Perl版本:

% perl -pe'BEGIN { $/ = "\n\n" } if (/\A\[MAIN\]/) { s/^three=\[4\]\n//m }' file

将输出:

[MAIN]
one=[1]
two=[2]
two=[3]
three=[5]

[sub]
one=[1]
two=[2]
three=[3]
three=[4]
three=[5]

顺便说一句,如果这是一种INI格式,您可能还想使用更合适的INI解析器。例如,以下是使用Config::IOD

执行此操作的方法
use Config::IOD;
my $iod = Config::IOD->new; 
my $doc = $iod->read_file("file"); 
$doc->delete_key({
    all  => 1, 
    cond => sub{ 
        my ($self, %args) = @_; 
        return 1 if $args{raw_value} =~ /4/;
    }, 
    "MAIN","three"
);
print $doc->as_string;

如果密钥的值中包含“4”,则上面的代码将删除“MAIN”部分下的所有“三”键行。您可以根据需要调整代码。

答案 1 :(得分:0)

awknull记录分隔符一起使用:

awk -v RS= -v ORS='\n\n' '/\[MAIN\]/{sub(/three=\[ab12\][[:space:]]*/, "")} 1' file
[MAIN]
one=[1]
two=[2]
three=[4]
three=[5]

[sub]
one=[1]
two=[2]
three=[3]
three=[4]
three=[5]

答案 2 :(得分:0)

这可能适合你(GNU sed):

sed '/\[MAIN\]/,/^$/!b;/three=\[4\]/d' file

如果它不在[MAIN]块内,则视为正常。否则删除匹配的行。