검색 및/또는 정규 표현식을 사용한 환상적인 예

검색 및/또는 정규 표현식을 사용한 환상적인 예

파일별로 정렬할 의도가 전혀 없는 일부 Windows 텍스트 파일을 감지하는 명령을 얻으려고 합니다 file... 가장 좋은 옵션은 정규식을 사용하여 줄 내용을 일치시키는 것 같지만 다음과 같은 단 하나의 예도 찾을 수 없습니다. 그 사용(공통 키워드 "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 내보내기 테이블

즉, 첫 번째 줄에서 "항목 단위:"를 일치시킨 다음 정규식을 시도하여 최대 2+1 줄에 도달합니다. 속도를 높이려면 정규식을 줄 시작 부분에 고정하세요.

이것은 Ubuntu 14.04, 파일 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 잔차(픽셀), 최대 잔차(픽셀), 사진 최대 잔차, 재료, 레이어, 마크, 유형, 처리에 사용됨, 고정, #제약 조건, 대상 코드, 대상 위치, 참조. 태그 확인,사진(tagged),색상(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/a,, "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/a,, "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

\^주요 문제는 줄의 시작 부분에서 \\^문자 그대로 캐럿을 이스케이프해야 한다는 것입니다 ^. 나는 ^unscaped의 특별한 의미가 무엇인지 파악하지 못했습니다 . 패턴을 더 읽기 쉽게 만들기 위해 공백을 이스케이프할 수도 있습니다.

좁은 범위의 행으로 일치를 제한하려고 합니다. 옵션(패턴 뒤가 아닌 단어 뒤)을 regex허용하여 검색 위치를 제한합니다./<length>regex마치다. 뒤에 length 가 오면 l바이트가 아닌 줄을 의미합니다. 내 테스트에서는 /1l빈 줄만 일치시킬 수 있습니다. 비어 있지 않은 줄은 정확한 시작 오프셋이 있어도 최소한 /2l.

~을 위한시작(버전 5.19 이전에는 문서에 "줄 수"로 해석된다고 명시되어 있지만 해당 offset명령문 은regex삭제됨일치하는 코드 변경 사항이 없으므로 그 전에는 정확했는지 의심됩니다. ) 이전 일치 항목의 끝부터 검색을 시작하려면 오프셋을 사용할 수 있지만 &0, 이전 일치 항목이 첫 번째 행의 중간에서 끝나는 경우에는 큰 차이가 없습니다.

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 정규식 \^Id, PhotoModeler 3D 내보내기 테이블

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

관련 정보