0%

给段落添加段落号

下载的srt格式字幕,mpv无法识别加载,subtitleeditor字幕编辑器也无法导入,但是可以以”纯文本“的方式导入,对比其他正常格式的字幕文件,发现问题字幕里面缺少段落标号,只有时间轴,给每段落添加编号可以解决该问题。

Perl

1
$ perl -00pe 's/^/$.\n/' file
  • -00 开启段落模式,行是由连续的“\n\n”分割,即每行是由段构成
  • -p 在Perl以-e参数运行后打印输入的每一行
  • s/^/$.\n/ 替换行开头为当前行(段落)号,^行开头,$.当前行行号,\n回车符号,该组合为在每段的上一行添加行号

Awk

1
$ awk -vRS='\n\n' -vORS='\n\n' '{print NR"\n"$0}' file | head -n -2 
  • -vRS='\n\n' 将awk的记录分隔符设置为\n\n,就像Perl的段模式一样,然后让awk打印(NR)行号,换行符\n以及当前行$0
  • -vORS='\n\n' 设置输出记录分隔符,以\n\n为分隔符输出每一行(段)
  • head -n -2 避免在文件结尾产生的2行空行

Shell脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/bash

l=1 # paragraph counter
echo -n $l # print paragraph counter without new line
while read x; do # read current line from file, see last line
if [[ $x == "" ]]; then # empty line?
echo # print empty line
read x # read next line from file, see last line
((l++)) # increment paragraph counter
#echo -n $l # print paragraph counter without new line
echo $l # print paragraph counter with new line
fi
echo "$x" # print current line
done < file

Extra

一开始用的参考文章的Perl的方法,输出的行号在每行开头,srt的格式是编号单独一行。对vim比较熟悉,就没考虑修改Perl代码,所以一开始考虑先用Perl的处理结果用vim的录制”宏”玩玩。

  • 处理完后的结果是这样:

    1
    2
    3
    4
    5
    6
    7
    8
    100:02:22,120 --> 00:02:24,240
    说到吃鱼, 海鱼肉质鲜甜

    200:02:24,320 --> 00:02:26,080
    没办法, 一定比养鱼好吃

    300:02:26,160 --> 00:02:29,360
    像这种鱼, 鱼身色泽暗淡
  • vim打开文件后,观察有相似的结构,很适合录制宏,开始光标在第一行第一个字符,按以下按键序列录制宏
    qaf0d0O[ESC]p4jq

  • 观察一共是824段,录制宏的时候第一段已经做过,此时只要821次释放宏就可以,821@a

  • 释放宏结果如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    1
    00:02:22,120 --> 00:02:24,240
    说到吃鱼, 海鱼肉质鲜甜

    2
    00:02:24,320 --> 00:02:26,080
    没办法, 一定比养鱼好吃

    3
    00:02:26,160 --> 00:02:29,360
    像这种鱼, 鱼身色泽暗淡

参考资料