검색 및/또는 정규식을 사용하는 마법의 예

검색 및/또는 정규식을 사용하는 마법의 예

file명령이 파일별로 분류되지 않은 일부 Windows 텍스트 파일을 감지하도록 하려고 합니다 ... 최선의 선택은 정규식을 사용하여 줄 내용을 일치시키는 것 같지만 그 사용 예를 하나도 찾을 수 없습니다(공통성 'file', 'magic' 및 'regex' 키워드는 Google 중심 세계에서는 도움이 되지 않습니다. 매뉴얼 페이지는 도움이 되지 않습니다.

게다가 ^$를 작동시킬 수 없습니다.

두 파일 모두 다음으로 시작합니다.

Project Units: <stuff>
Units & Scale - <stuff>
<blank line>

다음 줄은 4a) 개체 포인트 ID,사진 #, 4b) Id, 이름,

이에 대한 마법의 규칙에 대한 나의 시도는 다음과 같습니다.

0 문자열 프로젝트\040단위:
>2 정규식 ^Object\040point\040ID,Photo\040#, PhotoModeler 2D 내보내기 테이블

0 문자열 프로젝트\040단위:
>2 정규식 ^Id, 이름, PhotoModeler 3D 내보내기 테이블

즉, 첫 번째 줄에서 'Project Units:'를 일치시킨 다음 최대 2+1 줄까지 정규식을 시도합니다. 속도를 위해 정규 표현식을 줄 시작 부분에 고정하세요.

이것은 Ubuntu 14.04, file-5.14에 있습니다.

파일 유형 1의 예(처음 10줄만):

프로젝트 단위: 미터
단위 및 배율 - 활성, 변환 - 활성, 회전 - 활성

객체 포인트 ID,사진 #,X(픽셀),Y(픽셀),잔여 X,잔여 Y,잔여 벡터,마크 유형,레이어,재료,태그됨
2,1,1429.187065,1456.427823,-0.164541,0.182824,0.245964,LSM 원형,기본,흰색,
2,2,666.583514,1126.807078,-0.168174,0.109780,0.200833,LSM 원형,기본,흰색,
2,3,716.264669,1196.788962,0.152059,0.082258,0.172882,LSM 원형,기본,흰색,
2,4,674.145595,442.969428,0.119315,-0.050084,0.129401,LSM 원형,기본,흰색,
2,5,330.056929,836.292587,0.048372,-0.022235,0.053238,LSM 원형,기본,흰색,
2,6,1147.101715,39.253316,0.475434,-0.189514,0.511814,LSM 원형,기본,흰색,

파일 유형 2의 예(처음 10줄만):

프로젝트 단위: 미터
단위 및 배율 - 활성, 변환 - 활성, 회전 - 활성

ID,이름,사진(사용됨),X(프로젝트 단위),Y(프로젝트 단위),Z(프로젝트 단위),X 정밀도,Y 정밀도,Z 정밀도,정밀도 벡터 길이, 견고성(퍼센트), 견고성(프로젝트 단위) ,각도(도),컨트롤 이름,RMS 잔차(픽셀), 최대 잔차(픽셀),사진 최대 잔차,재료,레이어,태그 지정,유형,처리 중 사용,고정,#제약 조건,대상 코드,대상 비트,참조 . 태그 확인,사진(표시),색상(R),색상(G),색상(B)
2," ","1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21",0.285721 ,1.143037,-0.000990,0.000044,0.000043,0.000075,0.000097,0.037511,0.000682,85.604862, ,0.261467,0.511814,6,흰색,기본값, ,일반,예,아니요, 0, 해당 없음, 해당 없음, ," 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21",255,255,255
3," ","1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21",0.428622 ,1.143108,-0.000230,0.000044,0.000042,0.000074,0.000096,0.033814,0.000615,86.326354, ,0.222883,0.475602,6,흰색,기본값, ,일반,예,아니요, 0, 해당 없음, 해당 없음, ," 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21",255,255,255
4," ","1,2,3,4,5,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21",0.142979,1.143124 ,-0.000840,0.000045,0.000044,0.000078,0.000100,0.030045,0.000546,84.468461, ,0.239445,0.374918,16,흰색,기본값, ,일반,예,아니요,0,n/a,n/ 에, ,"1, 2,3,4,5,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21",255,255,255
5," ","1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21",0.571353 ,1.143164,0.000784,0.000044,0.000042,0.000074,0.000096,0.027194,0.000494,86.593419, ,0.213540,0.430629,6,흰색,기본값, ,일반,예,아니요,0 ,해당 없음,해당 없음, ,"1 ,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21",255,255,255
6," ","1,2,3,4,5,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21",0.000141,1.143101 ,-0.000885,0.000046,0.000045,0.000081,0.000103,0.035513,0.000646,82.937166, ,0.291437,0.465014,16,흰색,기본값, ,일반,예,아니요,0,n/a,n/ 에, ,"1, 2,3,4,5,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21",255,255,255
7," ","1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21",0.714058 ,1.143134,0.000247,0.000044,0.000043,0.000075,0.000097,0.030057,0.000547,86.326626, ,0.221009,0.426056,6,흰색,기본값, ,일반,예,아니요,0 ,해당 없음,해당 없음, ,"1 ,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21",255,255,255

답변1

그만큼파일(1)맨페이지에서는 명령 실행 방법만 알려줍니다. 매직 패턴에 대한 설명은 다음을 참조하세요.마법(5). 그러나 섹션은 regex특별히 상세하지 않습니다. 함께 제공되는 패턴 파일에서 다양한 사용 예를 찾을 수 있습니다. https://github.com/file/file/tree/master/magic/Magdir

주요 문제는 캐럿이 이스케이프되어야 한다는 것입니다. \^즉, 줄 시작 부분의 \\^경우 리터럴 ^. 나는 이스케이프되지 않은 것이 어떤 특별한 의미를 갖는지 알아내지 못했습니다 ^. 공백을 이스케이프 처리하여 패턴을 좀 더 읽기 쉽게 만들 수도 있습니다.

좁은 선 범위로 일치 항목을 제한하려고 합니다. 옵션(패턴 뒤가 아닌 단어 뒤 )을 regex취 하므로 검색 위치가 제한됩니다./<length>regex. 길이 뒤에 가 오면 l바이트 대신 라인을 의미합니다. 내 테스트에서는 /1l빈 줄만 일치시킬 수 있습니다. 비어 있지 않은 줄은 정확한 시작 오프셋을 사용하는 경우에도 최소한 /2l.

에 대한시작검색의 offset경우에도 바이트 수로 해석됩니다 regex. (버전 5.19 이전에는 문서에 "줄 수"로 해석된다고 나와 있지만 해당 설명은제거됨일치하는 코드 변경이 없기 때문에 그 이전에도 정확했는지 의심스럽습니다.) offset을 사용하면 &0이전 일치가 끝난 후부터 검색을 시작할 수 있지만 이전 일치가 20초에 끝난 경우에는 큰 차이가 없습니다. 첫줄 중간.

또한 "줄의 시작"은 offset파일의 줄 시작 여부에 관계없이 "검색 범위의 시작"(예: from )과도 일치합니다.

따라서 항목을 보다 엄격하게 일치시키려면 모든 줄에 전체 줄 정규 표현식을 사용하고 &1다음 일치 항목에서 오프셋을 사용하여 이전 개행을 건너뛰고 \^예상대로 작동하도록 올바른 위치에 있을 수 있습니다. 이는 사용자 정의 파일 형식을 식별하는 데 과잉일 수 있습니다.

마지막으로, 공통 부분을 반복할 필요가 없습니다. 들여쓰기 수준은 >동일한 수준의 이전 패턴이 실패했을 때 패턴을 시도해야 함을 의미합니다.

이 모든 것을 하나로 합치면:

0       regex/2l        \^Project\ Units:.*$
>&1     regex/2l        \^Units\ &\ Scale.*$
>>&1    regex/1l        \^$
>>>&1   regex/2l        \^Object\ Point\ ID     Photo Modeler 2D export table   
>>>&1   regex/2l        \^Id,Name,Photos        Photo Modeler 3D export table

답변2

한 가지 해결책은 @JigglyNaga 때문이었습니다. 캐럿을 탈출했습니다. 아래 스니펫은 이제 내 .magic 파일의 일부입니다.

0 문자열 프로젝트\040단위:
>2 regex \^Id, PhotoModeler 3D 내보내기 테이블

0 문자열 프로젝트\040단위:
>2 정규식 \^Object\040Point\040ID, PhotoModeler 2D 내보내기 테이블

관련 정보