csplit이 제공된 정규식을 인식하지 못합니다.

csplit이 제공된 정규식을 인식하지 못합니다.

저는 이 대용량 파일을 작업 중입니다(데이터.DAT, ~900MB) 여기에는 다른 여러 파일이 포함되어 있습니다. PS2 게임에서 나온 내용입니다.

사운드 샘플(위치:.AIFF형식)이 내가 추구하는 형식이며 크기의 대부분을 차지합니다.

PS2를 온라인으로 검색한 후.DAT나는 그들이 기본적으로 개발자에 의존한다는 것을 알았고, 이 게임/도구는 꽤 모호하고 온라인에서 이에 대한 많은 정보를 찾을 수 없기 때문에 프로세스를 직접 자동화하려고 생각하고 있습니다.

Hex Editor에서 파일을 검사하는 동안 몇 가지 문제를 발견했습니다..AIFF헤더, 블록을 새 블록에 복제.AIFF파일이 있으면 추가 작업 없이 재생할 수 있습니다.

매우 제한된 bash 지식에서 벗어나 여기에서 비슷한 질문을 읽고 다음 표현을 생각해내는 데 시간이 걸렸습니다.

gcsplit -f "sample-" -b "%04d.aif" DATA.DAT /FORM/ '{*}'

(저는 OSX에서 coreutils를 사용하고 있으므로 csplit에서는 g- 접두사를 사용합니다)

반면.AIFF파일은 문자열 "FORM"으로 시작하고 파일의 모든 샘플이 본질적으로 서로 옆에 있다는 점(샘플에 원치 않는 종료 노이즈를 생성하지 않는 무시할 수 있는 양의 데이터 간격)을 고려하여 정규 표현식이 다음과 같다고 생각했습니다. 방법

/FORM/

파일을 분리하는 것으로 충분합니다.

그러나 각 분할 파일은 사운드 샘플 사이에 있는 가비지 데이터를 출력합니다..AIFF제목이 재생 불가능하게 됩니다.

다음은 사운드 샘플을 분할하는 16진수 데이터의 스크린샷입니다.

잘못된 분할

이 실제 예제는 약 1500바이트에서 시작됩니다.

견본

이 표현식이 파일을 오프셋으로 분할하는 이유는 무엇입니까?

답변1

Csplit은 텍스트 유틸리티입니다. 라인 기반입니다. 패턴은 /FORM/" FORM포함하는 줄"을 의미합니다. 라인은 LF(newline이라고도 하며 , ^J, …로 쓸 수 있는 newline) 이외의 바이트 시퀀스이며 그 \n뒤에는 LF 바이트(또는 GNU 유틸리티를 사용할 경우 파일 끝에)가 있습니다. 따라서 관찰한 "쓰레기"는 FORM이전 LF 문자와 하위 문자열 사이의 모든 것입니다.

매뉴얼 페이지와 --help간단한 설명에서는 명령이 수행하는 작업을 이미 알고 있다고 가정하므로 설명 없이 "조각"만 언급합니다. 너는 읽어야 해완전한 문서해당 부분에 대한 설명을 확인하세요.

csplit로는 원하는 것을 할 수 없습니다. GNU awk를 사용하여 이를 수행할 수 있습니다. (다른 버전의 awk에는 임의의 레코드 구분 기호 및 널 바이트 처리 지원 등 필요한 기능이 없을 수 있습니다.)

gawk -v RS='FORM' -v ORS='' '{
    print "FORM" $0 >sprintf("sample-%04d.aif", n++)
}' DATA.DAT

그러나 압축된 데이터에 정확히 4바이트가 포함되어 있으면 FORM잘못된 위치에서 잘릴 수 있습니다. 이는 수동 검사의 일회성 작업에 충분할 수 있지만 신뢰할 수 있는 것이 필요한 경우 형식 인식 도구를 사용하는 것이 좋습니다.

답변2

텍스트 기반 유틸리티는 바이너리 파일을 조작하는 데 적합하지 않습니다.

더 나은 결과를 얻을 수도 있습니다도서관/AIFC,Py 사운드 파일, 또는ffmpeg명령줄 응용 프로그램입니다.

관련 정보