pega texto fora do arquivo vtt

1

vtt tem esta aparência:

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]

que 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\n com espaço, mas não consigo descobrir como fazer o sed ou o grep fazer isso.

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

OBSERVAÇÃO: isso tem que funcionar para outros caracteres de idioma, como o chinês hindi arábico, então, de preferência nenhum tipo [a-z] corresponde, mas, em vez disso, remove as linhas de temporização que são muito consistentes no formato. Também não remova cegamente quaisquer números, pois o texto pode conter números

NOTA 2: o objetivo final é ter o texto seguro para um valor de json, então todos os caracteres especiais são removidos e as aspas duplas escapam, mas isso está além do escopo desta questão

    
por AwokeKnowing 26.10.2016 / 00:38

2 respostas

1

Como seu arquivo parece consistir em uma sequência de registros separados por uma ou mais linhas em branco, sugiro tentar algo com base nos modos de parágrafo de awk ou perl .

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

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

você pode dividir em campos delimitados por novas linhas em parágrafos separados em branco e ignorar 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 puder contar com um número fixo de campos (linhas) a serem removidos, é bastante fácil adicionar um teste de expressão regular - um pouco mais fácil em perl , já que isso nos permite grep diretamente em matrizes, em vez de escrever um loop explícito. Por exemplo, para dividir em registros separados em branco e, em seguida, imprimir apenas os campos (linhas) com pelo menos uma seqüê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 string WEBVTT , basta pular o primeiro registro, ou seja,

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

Você terá que escolher um regex adequado que capture as linhas desejadas e exclua as indesejadas. Você pode adicionar um bloco END em awk ou perl se quiser adicionar uma nova linha final à saída concatenada.

OBSERVAÇÃO: uma vez que (com base na discussão em comentários) seus arquivos parecem ter finais de linha CRLF no estilo DOS, você precisará lidar com eles - modificando o campo e registrando os separadores nos comandos acima, ou retirando o CR s primeiro eg

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/$
    
por 26.10.2016 / 19:43
0

ok, aqui está o que acabei com

#!/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 têm - >
  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. remova o cabeçalho WEBVTT
  6. remover novas linhas
  7. esprema vários espaços para 1
  8. remover guias
  9. escape de todas as barras invertidas (por json)
  10. escape de qualquer cota dupla (para json)

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

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

Eu percebo que é bastante ineficiente embora. Eu gostaria de receber dicas sobre isso.

    
por 26.10.2016 / 08:26