我已经浏览了论坛,但我还没有找到类似的东西。我有这种格式的文件。
(
: (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}'
它可以工作,除了它还删除红色支架。我该怎么做才能只拆下一个支架并清洁?感谢。
答案 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
块的那些行。