【问题标题】:Delete a line from a block从块中删除一行
【发布时间】:2016-01-05 20:32:45
【问题描述】:

我想搜索一个字符串并将其从块中删除。我尝试使用sedawk,但我无法弄清楚。

让积木变成这样:

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

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

我需要进入 Main 块并通过搜索删除 three=[4]

【问题讨论】:

    标签: linux perl shell awk sed


    【解决方案1】:

    使用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]
    

    【讨论】:

    • 感谢您的回复。这似乎只有在three=[4] 时才有效,但如果有更多像three=[1234] 这样的数字则无效。
    • 抱歉再次添加...你能不能让它通用,比如可以说值不必是单独的数字,它也可以是字符串,如three=[1234]或three[abcdc]等等......上面也删除了我的块之间的空间,这不应该发生。谢谢
    • 伙计,这会删除所有同名的值,正如我在问题中提到的那样,我只想删除一个值,其余的值应该保持不变,包括空格。 [主] 一=[1] 二=[2] 三=[BHAVA] 三=[1234] 三=[5] [子] 一=[1] 二=[2] 三=[3] 三=[ANU ] 三=[5123]
    • awk -v RS= -v ORS='\n\n' '/[MAIN]/{sub(/three=[[^]]*][[:space:]]* /, "")} 1' 文件>>>> 这个看起来很适合字母,,,,你能不能让它通用,可以删除数字、字母和字母数字值,比如三=[123] 三=[acb] 三=[ab12],根据我的值,它应该删除它,就像我给 ab12 一样,它应该单独删除那条线
    • 我建议你开始学习正则表达式。 /three=\[[^\]]*\][[:space:]]*/ 将匹配 three[] 之间的任何内容。所以所有three=[123] three=[acb] three=[ab12]都会被匹配并删除。
    【解决方案2】:

    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”部分下的所有“三个”键行。您可以根据需要调整代码。

    【讨论】:

      【解决方案3】:

      这可能对你有用(GNU sed):

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-08-29
        • 2017-01-23
        • 1970-01-01
        • 1970-01-01
        • 2023-03-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多