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構いません。タグ(StartおよびStop\nRec)はデータと行を共有しません(つまり、で検索する必要があります^tag$)。閉じるタグはStop\nRec2行のタグでなければなりません。

ただし、Starta の前に 2 つ以上が見つかった場合は、a 以前に見つかった最後の項目からのみ抑制をStop\nRec適用する必要があります (行の合計を保持するなど)。StartStop\nRecIIIIIIIJJJJJJJ

そして、ファイルの終わりにStartマーカーが見つかりましたが、マーカーがない場合は、Stop\nRecこのマーカーとファイルの終わりの間の行を維持する必要があります(つまり、行を保持)。StartStart WWWWWW XXXXXX YYYYYY ZZZZZZ

sed(Linuxのbashシェルで実行)と-iオプション(入力と出力に同じファイル)を使用してこの修正を実行したいと思います。

次の操作を行いましたが、機能しません(特にStop \ nRecマーカーに到達する前に複数の開始マーカーが表示される場合)。

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

おすすめ記事