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
ブロックを追加しますawk
。perl
注:(コメントの議論によると)ファイルに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'
- Windowsの改行を修正
- -->なしですべての行を検索
- 空でないすべての行を探します。 (これは速いと思います。そうではありません。)
- 数字だけではなくすべての行を検索
- WEBVTTヘッダーの削除
- 改行を削除
- 複数のスペースを1つに圧縮
- タグの削除
- バックスラッシュをエスケープします(jsonの場合)。
- 二重引用符をエスケープします(jsonの場合)。
Windows改行の問題を修正してくれた@steeldriverに感謝します。
たとえば、「You are --> my friend」などのテキスト行をスキップし、他の場合はこの機能が少し弱いため、本番では使用しません。しかし、私にとっては十分でしょう。探す)
私はこれが非常に非効率的であることに気づきました。これについてのアドバイスを聞きたいです。