vttファイルからテキストをインポートする

vttファイルからテキストをインポートする

vttファイルは次のとおりです。

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

次のテキストが必要です。

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

Ubuntuでは、私は次のことを試しました。

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]

これは私に次のことを与えます:

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

しかし、残りはどうすべきかわかりません。私が交換したいのは

\n[0-9]+\n\n空白がありますが、sedまたはgrepを使用してこれを行う方法がわかりません。

デフォルト/移植可能(通常はubuntu、centosなどにプリインストールされているgrep、sed、またはtrコマンド)を使用して字幕タイミングを削除し、1行(改行なし)で元のテキストを取得するにはどうすればよいですか?

注:これは中国語ヒンディー語アラビア語などの他の言語文字でも機能する必要があるため、[az]型の一致を使用せずにフォーマットが非常に一貫したタイミングラインを削除することをお勧めします。また、テキストに数字を含めることができるので、盲目的に数字を削除しないでください。

注2:究極の目標はjson値に対してテキストを安全にすることで、すべての特殊文字が削除され、二重引用符がエスケープされますが、これはこの質問の範囲外です。

答え1

あなたのファイルは、1つ以上の空白行で区切られた一連のレコードで構成されているため、以下に基づいて試してみることをお勧めします。短絡モードawkまたは一つperl

たとえば、次のように常に最初の2行を削除する必要がある場合

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

次のいずれかの方法を使用して、スペースで区切られた段落を改行区切りフィールドに分割し、最初の2つのフィールドをスキップできます。

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

または

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

削除するフィールド(行)の固定数に依存できない場合は、正規表現テストを追加するのは非常に簡単です。これにより、明示的なループを作成するのではなく、配列で直接作業できるため、perl少し簡単です。grepたとえば、スペースで区切られたレコードに分割し、3つ以上のアルファベット文字シーケンスを含むフィールド(行)のみを印刷するには、次のようにします。

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

その文字列を除外するには、WEBVTT最初のレコードをスキップするだけです。

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

適切な正規表現を選択して必要な行をキャプチャし、不要な行を除外できます。リンクされた出力に最後の改行を追加するには、またはにENDブロックを追加しますawkperl


注:(コメントの議論によると)ファイルにDOSスタイルの行末CRLFがあるように見えるので、それを処理する必要があります。上記のコマンドでフィールドとレコードの区切り文字を適切に変更するか、最初のCRエントリを削除します。

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

答え2

わかりました、これは私の結果です。

#!/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の改行を修正
  2. -->なしですべての行を検索
  3. 空でないすべての行を探します。 (これは速いと思います。そうではありません。)
  4. 数字だけではなくすべての行を検索
  5. WEBVTTヘッダーの削除
  6. 改行を削除
  7. 複数のスペースを1つに圧縮
  8. タグの削除
  9. バックスラッシュをエスケープします(jsonの場合)。
  10. 二重引用符をエスケープします(jsonの場合)。

Windows改行の問題を修正してくれた@steeldriverに感謝します。

たとえば、「You are --> my friend」などのテキスト行をスキップし、他の場合はこの機能が少し弱いため、本番では使用しません。しかし、私にとっては十分でしょう。探す)

私はこれが非常に非効率的であることに気づきました。これについてのアドバイスを聞きたいです。

関連情報