다음과 같은 대용량(2GB) 파일이 있습니다.
^%%-=-=-=-=-=-=-=-=-=-=-=-=-=-%%^
<binary data>
^%%-=-=-=-=-=-=-=-=-=-=-=-=-=-%%^
<binary data>
^%%-=-=-=-=-=-=-=-=-=-=-=-=-=-%%^
<binary data>
...
선 ^%%-=-=-=-=-=-=-=-=-=-=-=-=-=-%%^
은 구분 기호입니다. 바이너리 세그먼트가 큽니다. 기록 보관소에는 약 50개가 있습니다.
파일의 바이너리 부분을 추출하려고 합니다. 각 바이너리 세그먼트는 자체 파일로 이동해야 합니다.
사용해 보았는데 csplit
,
csplit --digits=2 --prefix=out stu.ear '/\^%%-=-=-=-=-=-=-=-=-=-=-=-=-=-%%\^/'
그러나 다음 출력과 두 개의 out??
파일을 받았습니다.
1
2097951144
이를 수행할 수 있는 도구가 있습니까( csplit
바이너리를 처리할 수 있는 구현일까요?)
답변1
이를 위해 작은 Python 도구를 작성했습니다.https://github.com/mypalmike/csplitb
csplitb.py --prefix X --suffix Y --number Z XXXXXXXX input-file.extension
엑스= 이름으로 시작하는 출력 파일 이름
예= 원하는 출력 파일 확장자
지= 출력 파일을 구별하는 데 사용되는 비트 수
XXXXXXXXX= 입력 파일에서 분할할 각 바이너리 파일의 시작 16진수
입력 파일.확장자= 파일 분할 중
예:
csplitb.py --prefix photo --suffix .png --number 4 89504e47 block-file.raw
산출:
photo0000.png
photo0001.png
photo0002.png
.............
답변2
다음이 작동합니다:
awk '/\^%%-=-=-=-=-=-=-=-=-=-=-=-=-=-%%\^/{n++}{print >"out" n ".ear" }
답변3
text 가 처음 나타날 때 파일을 분할하도록 csplit에 지시합니다 ^%%-=-=-=-=-=-=-=-=-=-=-=-=-=-%%^
. 따라서 자연스럽게 두 부분으로 끝나게 됩니다. 하나는 파일의 첫 번째 바이트(첫 번째 구분 기호 앞에 개행 또는 공백이 있습니까?)를 포함하고 다른 부분은 첫 번째 구분 기호부터 시작하는 모든 것을 포함합니다.
별도의 파일로 분할하려면 조각에서 1을 뺀 횟수만큼 이 패턴을 반복해야 합니다. 이식 가능한 경우 조각화를 계산해야 합니다.
csplit --digits=2 --prefix=out stu.ear '/\^%%-=-=-=-=-=-=-=-=-=-=-=-=-=-%%\^/'"{$(grep -c '\^%%-=-=-=-=-=-=-=-=-=-=-=-=-=-%%\^' stu.ear)}"
GNU에는 csplit
패턴을 무제한으로 반복할 수 있는 확장 기능이 있습니다.
csplit --digits=2 --prefix=out stu.ear '/\^%%-=-=-=-=-=-=-=-=-=-=-=-=-=-%%\^/ {*}'
그러나 구분 기호가 출력에 포함되어 있기 때문에 원하는 대로 수행되지 않습니다. 나중에 파일에서 제거할 수 있습니다. 패턴 구분 기호 %
대신 파일 끝에 구분 기호를 사용하도록 배열하는 것이 더 쉽습니다 . 그러나 csplit은 귀엽지만 사용 사례가 매우 좁고 귀하의 사례가 이에 적합하지 않다는 사실을 받아들이는 것이 좋습니다. 보다 적절한 도구를 사용하세요/
csplit … '%\^\%\%-=-=-=-=-=-=-=-=-=-=-=-=-=-\%\%\^% {*}'
awk와 같은.