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

우분투에서 나는 다음을 시도했습니다.

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 명령)을 사용하여 자막 타이밍을 제거하고 한 줄(줄 바꿈 없이)로 원본 텍스트를 얻으려면 어떻게 해야 합니까?

참고: 이는 중국어 힌디어 아랍어와 같은 다른 언어 문자에서도 작동해야 하므로 [az] 유형 일치를 사용하지 않고 형식이 매우 일관된 타이밍 라인을 제거하는 것이 좋습니다. 또한 텍스트에 숫자가 포함될 수 있으므로 맹목적으로 숫자를 제거하지 마세요.

참고 2: 궁극적인 목표는 json 값에 대해 텍스트를 안전하게 만드는 것이므로 모든 특수 문자가 제거되고 큰따옴표가 이스케이프되지만 이는 이 질문의 범위를 벗어납니다.

답변1

귀하의 파일은 하나 이상의 빈 줄로 구분된 일련의 레코드로 구성되어 있으므로 다음을 기반으로 시도해 볼 것을 제안합니다.단락 모드awk아니면 하나 perl.

예를 들어, 다음과 같이 항상 처음 두 행을 삭제해야 하는 경우

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

다음 방법 중 하나를 사용하여 공백으로 구분된 단락을 줄바꿈으로 구분된 필드로 분할하고 처음 두 필드를 건너뛸 수 있습니다.

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' 
  1. Windows 줄바꿈 수정
  2. --> 없이 모든 줄 찾기
  3. 비어 있지 않은 모든 행을 찾습니다. (이것이 더 빠르다고 생각합니다. 아닐 수도 있습니다.)
  4. 숫자만이 아닌 모든 행 찾기
  5. WEBVTT 헤더 제거
  6. 개행 제거
  7. 여러 공백을 1개로 압축
  8. 태그 삭제
  9. 백슬래시를 이스케이프 처리하세요(json의 경우).
  10. 큰따옴표를 이스케이프 처리하세요(json의 경우).

Windows 개행 문제를 수정해 주신 @steeldriver에게 감사드립니다.

예를 들어 "You are --> my friend"와 같은 텍스트 줄을 건너뛰고 다른 경우에는 이 기능이 약간 약하기 때문에 프로덕션에서는 사용하지 않을 것입니다. 하지만 저에게는 충분할 것입니다. 찾다)

나는 이것이 매우 비효율적이라는 것을 깨달았습니다. 이에 대한 조언을 듣고 싶습니다.

관련 정보