pegue o texto do arquivo vtt

pegue o texto do arquivo vtt

Os arquivos vtt ficam assim:

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

Eu preciso apenas do texto, assim:

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

no Ubuntu eu tentei:

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]

isso me dá:

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

mas não consigo descobrir como fazer o resto. o que eu quero substituir é

\n[0-9]+\n\ncom espaço, mas não consigo descobrir como fazer com que o sed ou o grep façam isso.

como faço para obter o comando básico/portátil (por exemplo, geralmente pré-instalado no ubuntu, centos, etc, por exemplo, grep, sed ou tr) apenas para o texto bruto com o tempo da legenda removido e tudo em uma linha (sem novas linhas)?

NOTA: isso deve funcionar para caracteres de outros idiomas, como chinês, hindi, árabe, portanto, de preferência, nenhum tipo [az] corresponde, mas em vez disso, remova as linhas de tempo que são muito consistentes no formato. Além disso, não remova cegamente nenhum número, pois o texto pode conter números

NOTA 2: o objetivo final é manter o texto seguro para um valor json, para que todos os caracteres especiais sejam removidos e as aspas duplas escapem, mas isso está além do escopo desta questão

Responder1

Como seu arquivo parece consistir em uma sequência de registros separados por uma ou mais linhas em branco, sugiro tentar algo baseado nomodos de parágrafode um awkou de outro perl.

Por exemplo, se você sempre precisar retirar as duas primeiras linhas, como

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

você pode dividir em campos delimitados por nova linha dentro de parágrafos separados em branco e pular os dois primeiros campos usando

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

ou

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

Se você não pode confiar na existência de um número fixo de campos (linhas) a serem removidos, então é bastante fácil adicionar um teste de expressão regular - um pouco mais fácil, perlpois nos permite fazer isso grepdiretamente em arrays em vez de escrever um loop explícito . Por exemplo, para dividir em registros separados em branco e depois imprimir apenas os campos (linhas) com pelo menos uma sequência de pelo menos 3 caracteres alfabéticos, você poderia usar

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

Se você quiser excluir a WEBVTTstring você pode simplesmente pular o primeiro registro, ou seja

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

Caberá a você escolher um regex adequado que capture as linhas desejadas e exclua as indesejadas. Você pode adicionar um ENDbloco awkou perlse desejar adicionar uma nova linha final à saída concatenada.


NOTA: como (com base na discussão nos comentários) seus arquivos parecem ter CRLFfinais de linha no estilo DOS, você precisará lidar com eles - modificando os separadores de campo e registro nos comandos acima de acordo ou removendo os CRs primeiro, por exemplo

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

Responder2

ok, aqui está o que acabei fazendo

#!/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. corrigir novas linhas do Windows
  2. encontre todas as linhas que não possuem ->
  3. encontre todas as linhas que não estão vazias (acho que isso é mais rápido, talvez não)
  4. encontre todas as linhas que não são apenas um número
  5. remover cabeçalho WEBVTT
  6. remover novas linhas
  7. esprema vários espaços para 1
  8. remover guias
  9. escapar de quaisquer barras invertidas (para json)
  10. escape de quaisquer aspas duplas (para json)

Obrigado ao @steeldriver pela correção das novas linhas do Windows.

Eu não usaria isso em produção porque é um pouco fraco, por exemplo, pularia linhas de texto como "você é --> meu amigo" e provavelmente alguns outros casos, mas deve ser bom o suficiente para meus propósitos (postando no solr para pesquisar)

Eu percebo que é bastante ineficiente. Eu apreciaria dicas sobre isso.

informação relacionada