如何清除.srt文件而不删除通过VIM出现在隐藏字幕中的数字?

时间:2016-09-13 04:35:28

标签: regex vim srt

众所周知,.srt文件是以具有3个底层部分的块结构化的,如下例所示:

228
00:39:06,680 --> 00:39:13,460
Lorem ipsum dolor sit amet

现在,让我们假设在隐藏式字幕中有一些摘录代表一位发言者引用其他人的文学作品的演讲,就像这个额外的例子一样:

228
00:39:06,680 --> 00:39:13,460
According to Erasmus, book 1, chapter 23...

问题:我希望仅通过删除帧编号来提取.srt中的文本,帧时间不删除,但是,隐藏字幕中显示的基数为引用 VIM

尝试:通过使用正则表达式和substitute命令,我找到了一种方法来删除"带有:%s/\d\d:\d\d:\d\d,\d\d\d --> \d\d:\d\d:\d\d,\d\d\d/ /g的持续时间行和具有相同想法的数字,除了现在使用选项/gc搜索每个基数编号条目以绕过文本中的那些。

但是,我提取了大量此类引文,应保留基数。为所有条目选择yes/no变成了繁琐的任务。

由于我在使用regex方面缺乏技巧,我认为至少有一个较少的"丑陋的"执行上述策略的方式。也许是一种更优雅的方式,不仅可以删除不需要的部分,还可以恢复没有帧和持续时间线的原始文本,例如:

Lorem ipsum dolor sit met
According to Erasmus, book 1, chapter 23...

有人知道怎么做吗?

2 个答案:

答案 0 :(得分:2)

  1. 不要用线条替换线条的内容,实际删除线条。不使用:s/PATTERN//g,而是使用:g/PATTERN/d(请参阅:help :g
  2. 使用^$锚定您的模式,仅匹配您要删除的内容完全的行。
  3. 放在一起:

    :g/^\d\+$/d
    :g/^\d\d:\d\d:\d\d,\d\d\d --> \d\d:\d\d:\d\d,\d\d\d$/d
    

    (哇,那是很多“d”)。

    这仍然有可能对仅包含 数字的“对话线”进行核对,但它不会吃掉仅在中间中的数字一条线。

    为了做得更好,我建议使用比Vim更适合的东西 - 编程语言或字幕编辑器:)

答案 1 :(得分:1)

如果你使用锚点,事情变得容易多了(虽然不一定更好看):

:%s/\v(%^|\n)\zs\d+\n\d{2}(:\d{2}){2},\d{3} --\> \d{2}(:\d{2}){2},\d{3}$\n//

这考虑了序列号和连接的持续时间,你不必担心文本中间的匹配。