Linux 从块中删除线

Linux 从块中删除线,linux,perl,shell,awk,sed,Linux,Perl,Shell,Awk,Sed,我想搜索字符串并将其从块中删除。我试过使用sed和awk,但我无法理解 让块像这样: [MAIN] one=[1] two=[2] three=[3] three=[4] three=[5] [sub] one=[1] two=[2] three=[3] three=[4] three=[5] 我需要进入主块内部,通过使用awk和null记录分隔符搜索,删除three=[4]。 awk -v RS= -v ORS='\n\n' '/\[MAIN\]/{sub(/three=\[ab12\][

我想搜索字符串并将其从块中删除。我试过使用
sed
awk
,但我无法理解

让块像这样:

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

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

我需要进入主块内部,通过使用
awk
null
记录分隔符搜索,删除
three=[4]

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]
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解析器。例如,以下是您将如何使用:

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

这可能适合您(GNU-sed):


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

谢谢您的回复。。这似乎只有在三=[4]时才有效,但如果有更多像三=[1234]这样的数字,则无效……很抱歉再次添加。。。你能不能让它成为通用的,比如说这个值不需要是数字,它可以是字符串,也可以是三=[1234]或三[abcdc]等。而且上面的内容删除了我的块之间的空格,这是不应该发生的。ThanksBuddy,这会删除相同名称中的所有值,正如我在问题中提到的,我希望只删除一个值,其余值应保持不变,包括空格。[MAIN]one=[1]two=[2]three=[BHAVA]three=[1234]three=[5][sub]one=[1]twoo=[2]three=[3]three=[3]awk-vrs=[5123]awk-vrs=-vors='\n\n'/[MAIN]/[sub(/three=[[^]]*]*][1]文件>>>这一个似乎非常适合字母数字,,,,,,,,,,,,,,你能把它变成通用的吗,可以删除字母数字和字母数字值,比如三=[123]three=[acb]three=[ab12],基于我的值,它应该对它进行深入研究,就像如果我给出ab12,它应该对这行进行深入研究一样,我建议你开始学习正则表达式<代码>/three=\[^\]*\][[:space:]*/将匹配
three[
]
之间的任何内容。因此,所有的
three=[123]three=[acb]three=[ab12]
都将被匹配并删除。
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;
sed '/\[MAIN\]/,/^$/!b;/three=\[4\]/d' file