使用sed删除行范围后的一行

时间:2015-11-06 18:47:45

标签: sed

我已经浏览了论坛,但我还没有找到类似的东西。我有这种格式的文件。

(
        : (yellow_domain
                :gp_granularity_config_time ()
                :gp_time (
                          :Time()
                 )                                                                                                        
                :lsm (false)
                :type (pv1_customer)
        )
        : (blue_domain
                :gp_granularity_config_time ()
                :gp_time (
                          :Time()
                 ) 
                :lsm (false)
                :type (pv1_customer)
        )
        : (red_domain
                :gp_granularity_config_time ()
                :gp_time (
                          :Time()
                 ) 
                :lsm (false)
                :type (pv1_customer)
        )
        : (green_domain
                :gp_granularity_config_time ()
                :gp_time (
                          :Time()
                 ) 
                :lsm (false)
                :sofaware (false)
                :type (pv1_customer)
        )
)

我使用以下命令删除以蓝色开头的括号

sed '/: (blue/,/:type (pv1_customer)/ {d;p}'

但它在红色括号开始之前只留下一条直线括号。如果我使用,

sed '/: (blue/,/:type (pv1_customer)/ {N;d;p}'

它可以工作,除了它还删除红色支架。我该怎么做才能只拆下一个支架并清洁?感谢。

3 个答案:

答案 0 :(得分:1)

回答原始问题

据我了解,您想要从blue删除以)开头的以下行。这样做:

$ sed '/: (blue/,/^[[:space:]]*)/d' input
(
        : (yellow_domain
                :gp_granularity_config_time ()
                :gp_time ()
                :lsm (false)
                :type (pv1_customer)
        )
        : (red_domain
                :gp_granularity_config_time ()
                :gp_time ()
                :lsm (false)
                :type (pv1_customer)
        )
        : (green_domain
                :gp_granularity_config_time ()
                :gp_time ()
                :lsm (false)
                :sofaware (false)
                :type (pv1_customer)
        )
)

/: (blue/匹配范围的开头。 /^[[:space:]]*)/匹配范围的结尾(由以可选空格开头,后跟)开头的行标记)。 d告诉sed删除范围。

回答修订问题

在修订后的问题中,有些行以结束我们的组的空格关闭parens模式开头。在那种情况下:

$ sed '/:type (pv1_customer)/N; /: (blue/,/:type (pv1_customer)/d' input
(
        : (yellow_domain
                :gp_granularity_config_time ()
                :gp_time ()
                :lsm (false)
                :type (pv1_customer)
        )
        : (red_domain
                :gp_granularity_config_time ()
                :gp_time ()
                :lsm (false)
                :type (pv1_customer)
        )
        : (green_domain
                :gp_granularity_config_time ()
                :gp_time ()
                :lsm (false)
                :sofaware (false)
                :type (pv1_customer)
        )
)

这个答案更像是你原来的方法,但有一些关键变化:

  • /:type (pv1_customer)/N

    每当我们找到与:type (pv1_customer)匹配的行时,我们会在下一行中读取并将其添加到模式空间。

  • /: (blue/,/:type (pv1_customer)/d

    我们会删除组中的所有行,这些行以匹配: (blue的行开头,并以匹配type (pv1_customer)的行结束。但请注意,由于我们已经在包含type (pv1_customer)的行之后读取了该行,因此会同时删除该行。

答案 1 :(得分:1)

'/: (blue/,/^ *)$/ d'怎么样?

答案 2 :(得分:1)

这可能适合你(GNU sed):

 sed '/: (/h;G;/\n.*blue_domain/!P;d' file

这将删除blue_domain块中的所有行,它使用保留空间作为变量,该变量在遇到块的开始时设置,即包含字符串: (的任何行。每一行都附加了变量,只打印变量中没有blue_domain块的那些行。