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

使用sed删除行范围后的一行,sed,Sed,我浏览了论坛,但没有发现类似的东西。我有一个这种格式的文件 ( : (yellow_domain :gp_granularity_config_time () :gp_time ( :Time() )

我浏览了论坛,但没有发现类似的东西。我有一个这种格式的文件

(
        : (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}'
它可以正常工作,但会删除红色括号。如何使其仅拆下一个支架并进行清洁?谢谢。

回答原始问题 据我所知,您希望从
蓝色
删除到以下以
开头的行
。这就是:

$ 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)
        )
)
/:(蓝色/
匹配范围的开头。
/^[[:space:]]*)/
匹配范围的结尾(由一行标记,该行以可选空格开头,后跟
)<代码>d告诉sed删除该范围

修订问题的答覆 在修改后的问题中,有以空格close-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)
        )
)
这个答案更像您最初的方法,但有一些关键的变化:

  • /:类型(pv1_客户)/N

    每当我们找到与
    :type(pv1\u customer)
    匹配的行时,我们就会读入下一行并将其添加到模式空间中

  • /:(蓝色/,/:类型(pv1_客户)/d

    我们删除组中以匹配
    的行开始的所有行:(蓝色
    ,以匹配
    类型(pv1_客户)
    的行结束。但是,请注意,由于我们已经在包含
    类型(pv1_客户)
    的行之后读取了该行,因此它会同时被删除

关于
'/:(蓝色/,/^*)$/d'

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


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

你好,约翰,谢谢你的快速回答。我实际上删除了一些文本输入,因为它包含机密信息,但在主色\u域括号内有带关闭父项的行hesis。我如何避免这些?我将更改输入消息。我将更新您的答案。谢谢。@jarr这确实让它更有趣。我添加了一个技巧来处理这个问题:查看更新的答案。这样做了!!因此在您修改的答案中,第一部分
/:type(pv1\u customer)/N
,这会自动添加到模式空间。你能推荐一个好的资源来解释这一点吗?Sed确实有一些功能。我最喜欢的Sed教程是。因此,换句话说,只要一行匹配
:type(pv1\u customer)
N
命令也会将下一行添加到模式空间。这对输出没有任何影响,除非在下一个命令中触发了delete
d
命令。蓝色模式后所有内容都会被删除。谢谢。@jarr不客气。我过去经常做大量的sed/awk。起初,我以为你有一个类exerce cise。但是,你提到删除专有数据,所以你不必使用sed?任何比这更复杂的东西,我建议使用perl/python。@嗯???我发布了一个答案[这是正确的]。OP在我的答案下发布了一条评论。我在同一个地方向他发布了回复。在这种情况下,没关系,我不理解你的问题。
 sed '/: (/h;G;/\n.*blue_domain/!P;d' file