sed: 처음으로 나오지 않는 줄과 이전 줄을 삭제합니다.

sed: 처음으로 나오지 않는 줄과 이전 줄을 삭제합니다.

예를 들면 다음과 같습니다(예, .srt 파일에서).

231
00:13:35,230 --> 00:13:37,120
- Oh, my sister got me into it.

232
00:13:37,129 --> 00:13:38,269
- Yeah?

233
00:13:37,129 --> 00:13:38,269
Is that her?

234
00:13:40,049 --> 00:13:41,090
- Yeah.

선이 00:13:37,129 --> 00:13:38,269두 번 나타나서 두 부분을 연결하고 싶습니다. 따라서 다음과 같이 작동해야 합니다.

  • " --> "가 포함된 모든 줄을 확인하세요.
  • 이전 결과와 일치하는 경우 이 줄과 위의 두 줄을 삭제하세요.

결과는 다음과 같습니다.

231
00:13:35,230 --> 00:13:37,120
- Oh, my sister got me into it.

232
00:13:37,129 --> 00:13:38,269
- Yeah?
Is that her?

234
00:13:40,049 --> 00:13:41,090
- Yeah.

이것은 내 sed능력을 훨씬 넘어서는 일이다. 내부 버퍼와 패턴 공간에서 작동할 수 있나요? 글쎄, 나도 이 문제를 어떻게 해결해야 할지 모르겠어...

답변1

이 작업을 수행하려면 awk를 사용합니다.

$ cat tst.awk
(!NF) {                # blank line
    b = ""; f = 1      # empty buffer, start buffering
}
/-->/ {                # timestamp
    f = 0              # stop buffering
    if (p == $0) {     # same timestamp
        next           # discard buffer, start over
    }
    p = $0             # save timestamp
    printf "%s", b     # print buffer
}
f {                    # buffering enabled
    b = (b $0 ORS)     # buffer line
    next               # start over
}
1                      # print line

산출:

$ awk -f tst.awk file
231
00:13:35,230 --> 00:13:37,120
- Oh, my sister got me into it.

232
00:13:37,129 --> 00:13:38,269
- Yeah?
Is that her?

234
00:13:40,049 --> 00:13:41,090
- Yeah.

답변2

나는 awk 버전이 훨씬 낫다고 생각하지만, 여기 재미를 위한 bash 버전이 있습니다 :)

out="";
while read line;
do
    if [ "$prevtime" != "$line" ];then
        out="${out}${line}\n";
    else
        out="$(echo -e "${out}"|head -n -2)\n";
    fi ;
    echo  "${line}" |grep -q  "\-\->" &&  prevtime=$line  ;
done <test.srt ; echo -e "$out"

관련 정보