extraer texto del archivo vtt

extraer texto del archivo vtt

Los archivos vtt se ven así:

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

Necesito solo el texto, como este:

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

en ubuntu probé:

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]

eso me da:

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

pero no sé cómo hacer el resto. lo que quiero reemplazar es

\n[0-9]+\n\ncon espacio pero no puedo entender cómo hacer que sed o grep hagan eso.

¿Cómo puedo acceder con basic/portable (por ejemplo, generalmente preinstalado en ubuntu, centos, etc., por ejemplo, el comando grep, sed o tr) solo al texto sin formato sin la sincronización de los subtítulos, y todo en una línea (sin nuevas líneas)?

NOTA: esto tiene que funcionar para caracteres de otros idiomas, como el chino hindi árabe, por lo que es preferible que no coincida el tipo [az], sino que elimine las líneas de tiempo que tienen un formato muy consistente. Además, no elimine ningún número a ciegas, ya que el texto puede contener números.

NOTA 2: el objetivo final es que el texto sea seguro para un valor json, de modo que se eliminen todos los caracteres especiales y se escapen las comillas dobles, pero eso está más allá del alcance de esta pregunta.

Respuesta1

Dado que su archivo parece consistir en una secuencia de registros separados por una o más líneas en blanco, sugeriría probar algo basado en elmodos de párrafode cualquiera awko perl.

Por ejemplo, si siempre necesitas eliminar las dos primeras líneas, como

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

puede dividir en campos delimitados por nueva línea dentro de párrafos separados en blanco y omitir los dos primeros campos usando cualquiera de los dos

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

o

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

Si no puede confiar en que haya una cantidad fija de campos (líneas) para eliminar, entonces es bastante fácil agregar una prueba de expresión regular, un poco más fácil ya que perlnos permite hacerlo grepdirectamente en matrices en lugar de escribir un bucle explícito. . Por ejemplo, para dividir en registros separados en espacios en blanco y luego imprimir solo aquellos campos (líneas) que tengan al menos una secuencia de al menos 3 caracteres alfabéticos, puede usar

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

Si desea excluir la WEBVTTcadena, simplemente puede omitir el primer registro, es decir

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

Dependerá de usted elegir una expresión regular adecuada que capture las líneas deseadas y excluya las no deseadas. Puede agregar un ENDbloque en cualquiera de los dos casos awko perlsi desea agregar una nueva línea final a la salida concatenada.


NOTA: dado que (según la discusión en los comentarios) sus archivos parecen tener CRLFfinales de línea estilo DOS, deberá lidiar con ellos, ya sea modificando los separadores de campos y registros en los comandos anteriores en consecuencia, o eliminando los CRs. primero, por ejemplo

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

Respuesta2

ok, esto es con lo que terminé

#!/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. arreglar nuevas líneas de windows
  2. encuentra todas las líneas que no tienen -->
  3. encontrar todas las líneas que no estén vacías (creo que esto es más rápido, tal vez no)
  4. encontrar todas las líneas que no son solo un número
  5. eliminar el encabezado WEBVTT
  6. eliminar nuevas líneas
  7. apretar múltiples espacios a 1
  8. quitar pestañas
  9. escapar de cualquier barra invertida (para json)
  10. escapar de las comillas dobles (para json)

Gracias a @steeldriver por la corrección de las nuevas líneas de Windows.

No usaría esto en producción porque es un poco débil, por ejemplo, saltaría líneas de texto como "tú eres --> mi amigo" y probablemente algunos otros casos, pero debería ser lo suficientemente bueno para mis propósitos (publicar en solr para buscar)

Sin embargo, me doy cuenta de que es bastante ineficiente. Agradecería consejos al respecto.

información relacionada