В одном из фильмов не загружались субтитры. Решил посмотреть что не так, файл с субтитрами выглядел так
00:01:40.12,00:01:41.34
Dear God
00:01:41.44,00:01:44.15
Cut it off! His arm - cut it off!
00:01:58.92,00:02:00.23
Is he dead?
00:02:00.32,00:02:03.07
- Are you drunk, Mr Price?[br]- I am, I am.
00:02:03.16,00:02:06.35
- Is he dead, the Colonel?[br]- Not dead yet. He has hope.
00:02:06.44,00:02:09.43
Hey! You two. Get him back. Back!
00:02:11.32,00:02:14.91
We're in! Do you hear? They cheer!
00:02:15.00,00:02:16.95
Cuidad Rodrigo is taken
00:02:17.04,00:02:19.63
Oh. He looks dead to me.
...
А чтобы субтитры прочитались в моём плеере (GOMPlayer), он должен был выглядеть так:
0
00:01:40.12 --> 00:01:41.34
Dear God
1
00:01:41.44 --> 00:01:44.15
Cut it off! His arm - cut it off!
2
00:01:58.92 --> 00:02:00.23
Is he dead?
3
00:02:00.32 --> 00:02:03.07
- Are you drunk, Mr Price?[br]- I am, I am.
4
00:02:03.16 --> 00:02:06.35
- Is he dead, the Colonel?[br]- Not dead yet. He has hope.
5
00:02:06.44 --> 00:02:09.43
Hey! You two. Get him back. Back!
6
00:02:11.32 --> 00:02:14.91
We're in! Do you hear? They cheer!
7
00:02:15.00 --> 00:02:16.95
Cuidad Rodrigo is taken
8
00:02:17.04 --> 00:02:19.63
Oh. He looks dead to me.
...
Т.е. нужно добавить нумерацию и заменить запятые на стрелочки. Строк в файле 3438, вручную его править нет никакого желания. Поэтому я решил автоматизировать этот процесс.
Чтобы заменить запятые на стрелочки, можно воспользоваться макросами в виме. В первой строке выполняем
qw0f,cl --> <ESC>jjjq
Это создаст макрос на букве w, меняющий в текущей строке первую запятую на стрелочку и смещающий курсор на три строки вниз. Осталось теперь несколько раз набрать
1000@w
и все запятые будут заменены на стрелочки.
Теперь перейдём к нумерации. Тут мы воспользуемся M4, а именно пригодится макрос incr, который предназначен для увеличения своего параметра на единицу. Например, incr(`17') выдаст 18.
Будем хранить в переменной count кол-во занумерованных строк:
define(`count',`0')
а макрос current будет подставлять очередной номер субтитра и увеличивать count на 1:
define(`current',`define(`count',incr(count))count')
Эти два определения нужно расположить в самом начале файла.
Теперь вставляем current перед описанием каждого субтитра — используем тот же приём, что и при замене запятых, только создание макроса будет выглядеть так (предполагается, что курсор находится на пустой строке):
qwocurrent<ESC>jjjq
Осталось скормить это в m4:
m4 subtitles.srt4 > subtitles.srt
Всё, теперь субтитры грузятся и работают.
Осталась совсем маленькая деталь — в субтитрах можно обнаружить команду [br]. Она предназначена для разбиения субтитров на несколько строк, однако, GOMPlayer это игнорирует и отображает её как текст. Чтобы заменить все вхождения [br] на разбиение строк, достаточно выполнить команду
:%s/\[br\]/\r/g
Читать дальше......