regex - 用另一个列表替换与字符串匹配的行的有序列表

regex - 用另一个列表替换与字符串匹配的行的有序列表

我的想法很混乱,无法很好地综合描述这个问题,因此标题很糟糕。顺便给我推荐一个更好的吧。

基本上,我有两个 SubRip (.srt) 字幕,行数相同。它们使用不同的语言,我需要同步它们。

将一个点同步到另一个点并不能得到足够好的结果,因为第二个点显然有一些不好的定时线。我想要做的是将时间戳从第一个复制到第二个。

由于有些行有换行符,因此计时的节奏并不固定。要获取带有计时的行,我应该寻找从开始时间到结束时间的箭头。

1.srt

1
00:00:01,336 --> 00:00:03,437
Foo

2
00:00:03,440 --> 00:00:05,093
Bar
Baz

3
00:00:05,096 --> 00:00:07,330
Qux

2.srt

1
00:00:01,336 --> 00:00:03,935
Quux

2
00:00:03,936 --> 00:00:05,201
Garply
Waldo

3
00:00:05,803 --> 00:00:07,467
Fred
more 1.srt | grep -- "-->"

00:00:01,336 --> 00:00:03,437
00:00:03,440 --> 00:00:05,093
00:00:05,096 --> 00:00:07,330

more 2.srt  | grep -- "-->"

00:00:01,336 --> 00:00:03,935
00:00:03,936 --> 00:00:05,201
00:00:05,803 --> 00:00:07,467

我怎样才能将包含时间戳的行替换1.srt为相应的行2.srt

答案1

让我们描述性地命名文件:good-textgood-times

  1. 隔离带有时间戳的行good-times

    grep -- '-->' good-times > the-ringer
    
  2. 让我们awk替换错误的时间戳:

    < good-text awk '
       { if ($2 == "-->") getline < "the-ringer"
       print }
    ' > good-all
    

    每次awk遇到第二个字段为 的行时,-->它就用 中的一行替换它the-ringer

  3. 清除沃尔特的脏内衣垃圾:rm the-ringer

检查good-all,它应该包含您想要的内容。整个过程可以单独完成,awk但我决定

相关内容