두 태그 사이의 줄 삭제(일부 제한 사항 있음)

두 태그 사이의 줄 삭제(일부 제한 사항 있음)

입력 파일은 다음과 같습니다.

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\nRec2줄 태그여야 합니다.

그러나 Starta 이전에 둘 이상이 발견 되면 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

답변2

테스트해 보세요

sed '
    /Start/! b
    :a
    /\nStart$/{
        P
        D
    }
    N
    $b
    /Stop\nRec/! ba
    d
' Input.file

관련 정보