输入文件是这样的:
AAAAAAAAAAA
BBBBBBBBBBB
Start
CCCCCCCCCCC
DDDDDDDDDDD
Stop
EEEEEEEEEEE
Stop
Rec
FFFFFFFFFFF
GGGGGGGGGGG
HHHHHHHHHHH
Start
IIIIIIIIIII
JJJJJJJJJJJ
Start
KKKKKKKKKKK
LLLLLLLLLLL
MMMMMMMMMMM
NNNNNNNNNNN
Stop
Rec
OOOOOOOOOOO
PPPPPPPPPPP
QQQQQQQQQQQ
RRRRRRRRRRR
SSSSSSSSSSS
TTTTTTTTTTT
UUUUUUUUUUU
VVVVVVVVVVV
Start
WWWWWWWWWWW
XXXXXXXXXXX
YYYYYYYYYYY
ZZZZZZZZZZZ
期望的输出:
AAAAAAAAAAA
BBBBBBBBBBB
FFFFFFFFFFF
GGGGGGGGGGG
HHHHHHHHHHH
Start
IIIIIIIIIII
JJJJJJJJJJJ
OOOOOOOOOOO
PPPPPPPPPPP
QQQQQQQQQQQ
RRRRRRRRRRR
SSSSSSSSSSS
TTTTTTTTTTT
UUUUUUUUUUU
VVVVVVVVVVV
Start
WWWWWWWWWWW
XXXXXXXXXXX
YYYYYYYYYYY
ZZZZZZZZZZZ
我想删除标签Start
和标签之间的所有行Stop\nRec
(包括标签)。Start
-序列Stop\nRec
可以在长文件中出现多次。AAAAAA
, BBBBBB
,...ZZZZZZ
线可以是任何东西。标签 (Start
和Stop\nRec
) 不与数据共享行(即必须作为 进行搜索^tag$
。结束标签Stop\nRec
必须是 2 行标签。
但是,当在找到Start
a 之前找到多个时Stop\nRec
,抑制必须仅从Start
a 之前找到的最后一个开始应用Stop\nRec
(例如,保留行IIIIIII
和)。JJJJJJJ
并且,在文件末尾,当Start
遇到标记但没有标记时,必须保留此标记与文件末尾Stop\nRec
之间的行(例如,保留行)。Start
Start WWWWWW XXXXXX YYYYYY ZZZZZZ
我想使用 sed (在 Linux 上的 bash shell 下运行)并使用 -i 选项(用于输入和输出的相同文件)进行此修改。
我执行了以下操作,但它无法正常工作(特别是在到达 Stop\nRec 标记之前遇到多个 Start 标记时):
sed -i '/^Start\n/ {:a; $!{ N ; /\nStop\nRec$/!ba } s/.*// }' file.txt
在此先感谢您的帮助。
答案1
这似乎有效:
${H;x;p;q}
/Start/ {x;s/^\n//;p;d}
{H;N}
/Stop\nRec/ {s/.*//;h;d}
D
答案2
尝试测试
sed '
/Start/! b
:a
/\nStart$/{
P
D
}
N
$b
/Stop\nRec/! ba
d
' Input.file