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

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

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

사운드 샘플(.AIFF형식), 정확하게 내가 추구하는 것은 크기의 대부분을 구성합니다.

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

Hex Editor에서 파일을 검사하다가 몇 가지를 발견했습니다..AIFF헤더, 청크를 새로 복제했습니다..AIFF파일을 저장하고 추가 작업 없이 재생할 수 있었습니다.

나의 매우 제한된 bash 지식을 녹이는 데 시간을 보내고 여기에서 비슷한 질문을 읽은 후 다음 표현을 생각해 냈습니다.

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

(나는 coreutils를 사용하는 OSX를 사용하고 있으므로 csplit의 g- 접두어는 다음과 같습니다)

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

/FORM/

파일을 분할하면 충분합니다.

그러나 모든 분할 파일은 사운드 샘플 사이에 있는 정크 데이터와 함께 출력됩니다..AIFF헤더를 재생할 수 없게 만듭니다.

아래는 분할 사운드 샘플의 16진수 데이터 스크린샷입니다.

잘못된 분할

이 실제 샘플은 대략 1500바이트 표시 근처에서 시작됩니다.

견본

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

답변1

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

매뉴얼 페이지와 --help간단한 설명에서는 명령이 수행하는 작업을 이미 알고 있다고 가정하므로 설명 없이 "부분"만 언급합니다. 당신은 읽어야전체 문서조각이 무엇인지에 대한 설명을 얻으려면.

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

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

그러나 압축된 데이터에 우연히 4바이트가 포함된 경우에는 잘못된 위치에서 잘릴 수 있습니다 FORM. 수동 검토를 통해 일회성 작업을 수행하는 데는 이 방법으로 충분할 수 있지만 신뢰할 수 있는 것이 필요한 경우 형식 인식 도구를 사용하는 것이 더 나을 것입니다.

답변2

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

다음을 통해 더 나은 결과를 얻을 가능성이 높습니다.lib/aifc,PySound파일, 아니면 그ffmpeg명령줄 앱.

관련 정보