입력 파일은 다음과 같습니다.
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 이전에 둘 이상이 발견 되면 a 이전에 발견된 마지막 항목부터만 Stop\nRec
억제를 적용해야 합니다 (예: 행 합계 유지).Start
Stop\nRec
IIIIIII
JJJJJJJ
그리고 파일 끝에서 Start
마커가 발견되었지만 마커가 없는 경우 Stop\nRec
이 마커와 파일 끝 사이의 줄은 유지되어야 합니다(즉, 줄 유지).Start
Start 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