Text aus VTT-Datei extrahieren

Text aus VTT-Datei extrahieren

VTT-Dateien sehen folgendermaßen aus:

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

Ich brauche nur den Text, und zwar so:

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

unter Ubuntu habe ich versucht:

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]

das gibt mir:

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

aber ich kann nicht herausfinden, wie ich den Rest machen soll. Was ich ersetzen möchte, ist

\n[0-9]+\n\nmit Leerzeichen, aber ich kann nicht herausfinden, wie ich sed oder grep dazu bringe, das zu tun.

wie gelange ich mit Basic/Portable (z. B. im Allgemeinen in Ubuntu, CentOS usw. vorinstalliert, z. B. mit den Befehlen grep, sed oder tr) zum reinen Text, wobei die Untertitel-Zeitangabe entfernt wurde und alles in einer Zeile steht (ohne Zeilenumbrüche)?

HINWEIS: Dies muss auch für andere Sprachzeichen wie Chinesisch, Hindi und Arabisch funktionieren, also vorzugsweise keine Übereinstimmungen vom Typ [az], sondern stattdessen die Zeitlinien entfernen, die im Format sehr konsistent sind. Entfernen Sie auch nicht blind Zahlen, da Text Zahlen enthalten kann

ANMERKUNG 2: Das ultimative Ziel ist, den Text für einen JSON-Wert sicher zu haben, also alle Sonderzeichen zu entfernen und doppelte Anführungszeichen zu maskieren, aber das geht irgendwie über den Rahmen dieser Frage hinaus

Antwort1

Da Ihre Datei aus einer Folge von Datensätzen zu bestehen scheint, die durch eine oder mehrere Leerzeilen getrennt sind, würde ich vorschlagen, etwas zu versuchen, das auf demAbsatzmodivon entweder awkoder perl.

Wenn Sie beispielsweise immer die ersten beiden Zeilen entfernen müssen, wie

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

Sie können die Absätze in durch Zeilenumbrüche getrennte Felder aufteilen und die ersten beiden Felder überspringen, indem Sie entweder

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

oder

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

Wenn Sie sich nicht darauf verlassen können, dass eine feste Anzahl von Feldern (Zeilen) entfernt werden muss, ist es relativ einfach, einen regulären Ausdruckstest hinzuzufügen - etwas einfacher, perlda wir damit direkt auf Arrays zugreifen können, grepanstatt eine explizite Schleife zu schreiben. Um beispielsweise in durch Leerzeichen getrennte Datensätze aufzuteilen und dann nur die Felder (Zeilen) zu drucken, die mindestens eine Sequenz von mindestens 3 alphabetischen Zeichen enthalten, können Sie Folgendes verwenden:

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

Wenn Sie die Zeichenfolge ausschließen möchten, WEBVTTkönnen Sie einfach den ersten Datensatz überspringen, d. h.

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

Es liegt an Ihnen, einen geeigneten regulären Ausdruck auszuwählen, der die gewünschten Zeilen erfasst und die unerwünschten ausschließt. Sie können ENDentweder einen Block hinzufügen awkoder perlwenn Sie der verketteten Ausgabe eine abschließende neue Zeile hinzufügen möchten.


HINWEIS: Da (basierend auf der Diskussion in den Kommentaren) Ihre Dateien anscheinend CRLFZeilenenden im DOS-Stil haben, müssen Sie sich damit befassen - entweder indem Sie die Feld- und Datensatztrennzeichen in den obigen Befehlen entsprechend ändern oder indem Sie das CRerste „s“ entfernen, z. B.

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

Antwort2

ok, hier ist das Ergebnis

#!/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-Zeilenumbrüche reparieren
  2. finde alle Zeilen die nicht haben -->
  3. alle Zeilen finden, die nicht leer sind (ich denke, das ist schneller, vielleicht aber auch nicht)
  4. Finde alle Zeilen, die nicht nur aus Zahlen bestehen
  5. WEBVTT-Header entfernen
  6. Zeilenumbrüche entfernen
  7. mehrere Leerzeichen auf 1 zusammendrücken
  8. Registerkarten entfernen
  9. Escapen Sie alle Backslashes (für JSON)
  10. Escapen Sie alle Anführungszeichen (für JSON)

Danke an @steeldriver für den Fix für neue Zeilen in Windows.

Ich würde dies nicht in der Produktion verwenden, da es ein bisschen schwach ist, z. B. würde es Textzeilen wie „du bist --> mein Freund“ und wahrscheinlich einige andere Fälle überspringen, aber es sollte für meine Zwecke gut genug sein (Posten in Solr zum Suchen).

Mir ist allerdings klar, dass das ziemlich ineffizient ist. Für Tipps hierzu wäre ich dankbar.

verwandte Informationen