删除文本行块

时间:2013-12-05 08:29:50

标签: unix sed awk grep

情景:

#Start1
text
text
text
#Start2
text
#Start3
text
text

如上所示,块不确定包含它的行数。问题是如何利用unix命令删除其中一个块#Start2

我试过

less <file_name> | sed '/Start2/.+1d' | less

是的,如果我可以确定有多少行拖尾#Start2

,它可能适用于这种情况

但是,如果每次#Start2发生时拖尾的行数不恒定怎么办?我可能无法删除所有内容或意外删除其他块的某些内容。

我需要一种更复杂的方式来知道它是否触及了块的末尾。有没有?

由于

2 个答案:

答案 0 :(得分:2)

使用awk即可:

awk '/^#/ {f=0} /^#Start2/ {f=1} !f;' file
#Start1
text
text
text
#Start3
text
text

awk打印所有行,只要f=0或不是真 f以与empty相同的默认0开头 如果行以#设置f0开头,那么打印行 如果行以#Start2设置f1开头,请勿打印 这将使awk打印所有行并在找到#Start2后停止,然后在找到#时再次继续


另一种方法:

awk '!/Start2/' RS=# ORS=# file
#Start1
text
text
text
#Start3
text
text

这表示记录以#开头 如果记录包含Start2,则不要打印它。所有其他都将打印出来。

答案 1 :(得分:1)

PatStart="#Start2"
PatBlockEnd="^#"
sed -n "/${PatStart}/,/${PatBlockEnd}/ {
   /${PatStart}/ {x;s/.*//;x;}
   x;p;}" YourFile

使用2 Pat ... var来设置块边框(End假设这是一个从NEW LINE开始的新块,而不是在这种情况下当前块的结尾)。