从 vtt 文件中抓取文本

从 vtt 文件中抓取文本

vtt 文件如下所示:

WEBVTT

1
00:00:00.096 --> 00:00:05.047
you're the four functions if you would of 
management first of all you have the planning

2
00:00:06.002 --> 00:00:10.079
the planning stages basically you were choosing appropriate 
 organizational goals and courses

3
00:00:11.018 --> 00:00:13.003
action to best achieve those goals

我只需要文本,如下所示:

you're the four functions if you would of management first of all you have the planning the planning stages basically you were choosing appropriate organizational goals and courses action to best achieve those goals

在 ubuntu 上我尝试过:

cat file.vtt | grep -v [0-9][0-9]:[0-9][0-9]:[0-9][0-9].[0-9][0-9][0-9][[:space:]][[:punct:]][[:punct:]][[:punct:]][[:space:]][0-9][0-9]:[0-9][0-9]:[0-9][0-9].[0-9][0-9][0-9]

这给了我:

WEBVTT

1
you're the four functions if you would of 
management first of all you have the planning

2
the planning stages basically you were choosing appropriate 
 organizational goals and courses

3
action to best achieve those goals

但我不知道如何做剩下的事情。我想替换的是

\n[0-9]+\n\n有空格,但我不知道如何让 sed 或 grep 做到这一点。

我如何使用基本/便携式(例如,通常预装在ubuntu、centos等中,例如grep、sed或tr命令)获得删除了字幕计时的原始文本,并且全部在一行中(没有换行符)?

注意:这必须适用于其他语言字符,例如中文印地语阿拉伯语,因此最好没有 [az] 类型匹配,而是删除格式非常一致的计时线。也不要盲目删除任何数字,因为文本可以包含数字

注意 2:最终目标是让文本对于 json 值来说是安全的,因此所有特殊字符都被删除并双引号被转义,但这超出了这个问题的范围

答案1

由于您的文件似乎由一系列由一个或多个空行分隔的记录组成,因此我建议尝试基于段落模式awk或之一perl

例如,如果您总是需要删除前两行,例如

1
00:00:00.096 --> 00:00:05.047

您可以在空白分隔的段落中拆分为换行符分隔的字段,并使用以下任一方法跳过前两个字段

awk -vRS= -vORS= -F'\n' '{for(j=3;j<=NF;j++) print $j; print " "}' file.vtt

或者

perl -F'\n' -00ne 'print join("", @F[2..$#F]), " "' file.vtt

如果您不能依赖要删除的固定数量的字段(行),那么添加正则表达式测试相当容易 - 更容易一些,perl因为它允许我们grep直接在数组上而不是编写显式循环。例如,要拆分为以空格分隔的记录,然后仅打印那些至少具有至少 3 个字母字符的序列的字段(行),您可以使用

perl -F'\n' -00ane '
  print join("", grep { /[[:alpha:]]{3}/ } @F), " "
' file.vtt

如果你想排除该WEBVTT字符串,你可以简单地跳过第一条记录,即

perl -F'\n' -00ane '
  print join("", grep { /[[:alpha:]]{3}/ } @F), " " if $. > 1
  ' file.vtt

您可以选择一个合适的正则表达式来捕获所需的行并排除不需要的行。如果您想向连接的输出添加最终换行符,则可以END在 或 中添加一个块awkperl


注意:由于(基于评论中的讨论)您的文件似乎具有 DOS 样式的CRLF行结尾,因此您需要处理这些问题 - 相应地修改上述命令中的字段和记录分隔符,或者删除CRs第一个例如

sed 's/\r$//' file.vtt | 
  perl -F'\n' -00ane '
    print join("", grep { /[[:alpha:]]{3}/ } @F), " " if $. > 1
  '
you're the four functions if you would of management first of all you have the planning the planning stages basically you were choosing appropriate  organizational goals and courses action to best achieve those goals steeldriver@xenial-vm:~/test/$

答案2

好的,这就是我的结果

#!/bin/bash
fname=$1
sed 's/\r$//' "$fname"    |\
grep -v -- "-->"          |\
grep -v "^$"              |\
grep -E -v "^[0-9]+$"     |\
sed 's/WEBVTT//'          |\
tr '\n' ' '               |\
tr -s ' '                 |\
tr -d '\t'                |\
sed 's/\\/\\\\/g'         |\
sed 's/"/\\"/g' 
  1. 修复 Windows 换行符
  2. 查找所有没有 --> 的行
  3. 找到所有不为空的行(我认为这更快,也许不是)
  4. 查找所有不只是数字的行
  5. 删除 WEBVTT 标头
  6. 删除换行符
  7. 将多个空格压缩为 1
  8. 删除标签
  9. 转义任何反斜杠(对于 json)
  10. 转义任何双引号(对于 json)

感谢 @steeldriver 修复了 Windows 新行。

我不会在生产中使用它,因为它有点弱,例如它会跳过诸如“你是 --> 我的朋友”之类的文本行,可能还有其他一些情况,但它应该足以满足我的目的(发布到 solr用于搜索)

我意识到这是相当低效的。我希望得到这方面的建议。

相关内容