删除 2 个标签之间的行(有一些限制)

删除 2 个标签之间的行(有一些限制)

输入文件是这样的:

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线可以是任何东西。标签 (StartStop\nRec) 不与数据共享行(即必须作为 进行搜索^tag$。结束标签Stop\nRec必须是 2 行标签。

但是,当在找到Starta 之前找到多个时Stop\nRec,抑制必须仅从Starta 之前找到的最后一个开始应用Stop\nRec(例如,保留行IIIIIII和)。JJJJJJJ

并且,在文件末尾,当Start遇到标记但没有标记时,必须保留此标记与文件末尾Stop\nRec之间的行(例如,保留行)。StartStart 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

相关内容