음 일전에 grep과 sed, awk를 조합한 자막 파일 시간을 수정하는 것에 대해 올린 적이 있었는
데.. 아무래도 awk만으로 해결할 수 있지 않을까.. 하는 생각이 들었습니다.
그래서 만들었습니다. -.-;;
우선.. awk 스크립트입니다.
물론 마음대로 수정하셔도 됩니다.(관심이 있으시다면 ㅠ.ㅠ)
--------------
# file_name: adj_smi.awk
# last modified: 2002.6.15.
# awk script for adjustment of sync time in *.smi file
$0 ~ /<[Ss][Yy][Nn][Cc] / {
orig_time = GetTime($0);
if (from_line == "" || from_line <= NR) {
if (to_line == "" || NR <= to_line) {
if (from == "" || from <= orig_time) {
if (to == "" || orig_time <= to) {
chg_time = orig_time + adj_time;
gsub(orig_time, chg_time);
}
}
}
}
print;
}
$0 !~ /<[Ss][Yy][Nn][Cc] / {
print;
}
# get sync time from the such expression as "<SYNC start=1234><P Class=KRCC>"
# you can expect that return value will be "1234" in this situation.
function GetTime(str, i, j, len, tmp, time) {
# split whole string to array "tmp" by one character
split(str, tmp, "");
len = length(str);
for (i = 1; i < len; i++) {
if (tmp[i] == "=") {
# after "=", digits which we wanna get will probably(?) follow,
# and... continue up to ">".
for (j = i+1; j < len; j++) {
if (tmp[j] != ">")
time = time tmp[j];
else {
# return time and quit the function.
return (time+0);
}
}
}
}
}
------------------
<SYNC Start=2682376><P Class=KRCC>
해리 포터
<SYNC Start=2684229><P Class=KRCC>
<SYNC Start=2701741><P Class=KRCC>
음...어렵군. 아주 어려워.
<SYNC Start=2705956><P Class=KRCC>
아주 많은 용기를 볼 수 있구나.
<SYNC Start=2708168><P Class=KRCC>
나쁜 마음도 없고 <br>재능이 있다.
<SYNC Start=2711539><P Class=KRCC>
오~ 그래.<br>자신의 존재를 입증하려는 멋진 열망.
<SYNC Start=2716577><P Class=KRCC>
와 같이..
한 줄에 하나의 SYNC가 있을 것이라고 가정해서 만들었습니다.
(제약을 가하는 것은 좋지 않으니 수정을 해야겠습니다..)
사용법은 이렇습니다.
from과 to는 변경하고자 하는 시간대를 정합니다.
adj_time은 변경할 시간의 양을 정합니다.
3가지 변수 모두 단위는 ms(1/1000 초)입니다.
모든 범위에서 시간을 1초 뒤로 미룰경우
$ awk -f adj_smi.awk -v adj_time=1000 자막파일.smi > 새로운자막파일.smi
30분 부터 마지막까지 1초 앞으로 당길 경우
$ FROM=$((30*60*1000))
$ awk -f adj_smi.awk -v from=$FROM adj_time=-1000 자막파일.smi > 새로운자막파일.smi
# to는 지정하지 않아도 됩니다.
30분 부터 1시까지 1초 뒤로 미룰 경우
$ FROM=$((30*60*1000))
$ TO=$((1*60*60*1000))
$ awk -f adj_smi.awk -v from=$FROM to=$TO adj_time=1000 자막파일.smi > 새로운자막파일.smi
처음부터 30분까지 할 경우는?? FROM만을 썼던 예에서와 마찬가지로..
시간을 범위로 수정할 수 있는 것처럼 자막 파일에서 몇 번째 줄(from_line)부터
몇번째 줄(to_line)까지 편집할 수도 있습니다.
이것이 어디에 쓰이냐면...
중간에 자막 순서가 뒤바뀌어서 실제로 자막이 출력되지 않을 경우
부분적인 편집이 가능하도록 하기 위해서 입니다.
(범위 지정 잘못했다가.. 피 본 경험에서 우러나온.. ㅠ.ㅠ)
### 한 가지 주의하실 것은 수정할 자막 파일과, 새롭게 생성시킬 자막 파일이 같을 수 없
습니다. 중요합니다!! 최악으로 자막파일이 모조리 삭제될 염려가 있으니 정말 주의 하세
요.. 그리고 원본은 백업차원에서 우선 그냥 두는 것이 좋을 듯 싶습니다.
수정된 자막파일이 완성되기 전까지는 말이죠.
쓰기가 불편하죠? 이것을 가지고 shell script를 자신의 기호에 맞게
만드시면 좀 더 쓰시기 편리할 것이라는 생각이 듭니다.
특히 시와 분을 milli-second로 변환해서 넘겨줘야하는 부분은 짜증이 나니깐...
스크립트로 처리하는 것이 훨씬 좋을 것입니다.
잠깐... awk로도 처리할 수 있겠군요 -.-;;
틈틈이 업데이트 하겠습니다. -.-;;
음... 요즘들어 perl을 공부하고 싶다는 생각이 굴뚝같은데...
지금 공부하는 것도 벅찬 지경이라..
perl고수님께서 perl버전을 만들어 주심이 어떠 하신지요? ^^;;