예를 들면 다음과 같습니다(예, .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"