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\n
mit 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 awk
oder 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, perl
da wir damit direkt auf Arrays zugreifen können, grep
anstatt 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, WEBVTT
kö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 END
entweder einen Block hinzufügen awk
oder perl
wenn 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 CRLF
Zeilenenden 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 CR
erste „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'
- Windows-Zeilenumbrüche reparieren
- finde alle Zeilen die nicht haben -->
- alle Zeilen finden, die nicht leer sind (ich denke, das ist schneller, vielleicht aber auch nicht)
- Finde alle Zeilen, die nicht nur aus Zahlen bestehen
- WEBVTT-Header entfernen
- Zeilenumbrüche entfernen
- mehrere Leerzeichen auf 1 zusammendrücken
- Registerkarten entfernen
- Escapen Sie alle Backslashes (für JSON)
- 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.