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을 그렇게 하는 방법을 알 수 없습니다.

기본/이식성(예: 일반적으로 우분투, Centos 등에 사전 설치되어 있음, 예: grep, sed 또는 tr 명령)을 사용하여 자막 타이밍이 제거된 원시 텍스트만 모두 한 줄(개행 없음)로 가져오려면 어떻게 해야 합니까?

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

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

답변1

귀하의 파일은 하나 이상의 빈 줄로 구분된 일련의 레코드로 구성되어 있으므로단락 모드또는 .awkperl

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

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에 블록을 추가할 수 있습니다 .awkperl


참고: (주석의 논의에 따르면) 파일에 DOS 스타일 줄 끝이 있는 것으로 나타나므로 위 명령에서 필드 및 레코드 구분 기호를 적절하게 수정하거나 s를 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"와 같은 텍스트 줄을 건너뛰고 아마도 몇 가지 다른 경우가 있을 것입니다. 그러나 그것은 내 목적에 충분할 것입니다(solr에 게시). 검색용)

그래도 꽤 비효율적이라는 걸 깨달았습니다. 이에 대한 조언을 주시면 감사하겠습니다.

관련 정보