情景:
#Start1
text
text
text
#Start2
text
#Start3
text
text
如上所示,块不确定包含它的行数。问题是如何利用unix
命令删除其中一个块#Start2
。
我试过
less <file_name> | sed '/Start2/.+1d' | less
是的,如果我可以确定有多少行拖尾#Start2
但是,如果每次#Start2
发生时拖尾的行数不恒定怎么办?我可能无法删除所有内容或意外删除其他块的某些内容。
我需要一种更复杂的方式来知道它是否触及了块的末尾。有没有?
由于
答案 0 :(得分:2)
使用awk
即可:
awk '/^#/ {f=0} /^#Start2/ {f=1} !f;' file
#Start1
text
text
text
#Start3
text
text
此awk
打印所有行,只要f=0
或不是真
f
以与empty
相同的默认0
开头
如果行以#
设置f
到0
开头,那么打印行
如果行以#Start2
设置f
到1
开头,请勿打印
这将使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开始的新块,而不是在这种情况下当前块的结尾)。