захватить текст из файла 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, поэтому все специальные символы удалены и двойные кавычки экранированы, но это выходит за рамки этого вопроса

Поскольку ваш файл состоит из последовательности записей, разделенных одной или несколькими пустыми строками, я бы предложил попробовать что-то, основанное на режимах абзаца либо 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 вы можете просто пропустить первую запись, т. WEBVTT

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

Вам будет нужно выбрать подходящее регулярное выражение, которое захватывает нужные строки и исключает нежелательные. Вы можете добавить блок END в awk или perl если вы хотите добавить окончательную новую строку для конкатенированного вывода.


ПРИМЕЧАНИЕ: поскольку (на основе обсуждения в комментариях) ваши файлы, как представляется, имеют CRLF строки CRLF стиле DOS, вам придется иметь дело с ними – либо путем изменения поля и разделителей записей в вышеуказанных командах соответственно, либо путем удаления Например, CR s

 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/$ 

хорошо, вот что я закончил с

 #!/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. исправить окна newlines
  2. найти все строки, которые не имеют ->
  3. найти все строки, которые не пусты (я думаю, что это быстрее, а может и нет)
  4. найти все строки, которые не являются числом
  5. удалить заголовок WEBVTT
  6. удалить новые строки
  7. сжать несколько пробелов до 1
  8. удалить вкладки
  9. избегать любых обратных косых черт (для json)
  10. избегать любых двойных букв (для json)

Благодаря @steeldriver для исправления для новых окон Windows.

Я бы не использовал это в производстве, так как он немного слаб, например, он пропускал строки текста типа «вы -> мой друг» и, возможно, несколько других случаев, но он должен быть достаточно хорош для моих целей (отправка в solr для поиска)

Я понимаю, что это довольно неэффективно. Я был бы признателен за советы по этому поводу.