ejemplo mágico usando búsqueda y/o expresiones regulares

ejemplo mágico usando búsqueda y/o expresiones regulares

Estoy intentando que el filecomando detecte algunos archivos de texto de Windows que nunca debieron clasificarse por archivo... La mejor opción parece usar expresiones regulares para hacer coincidir el contenido de la línea, pero no puedo encontrar un solo ejemplo de su uso (los puntos en común de las palabras clave 'archivo', 'magia' y 'regex' no ayuda en un mundo centrado en Google). La página de manual no ayuda.

Además, no puedo hacer que ^ $ funcione.

Ambos archivos comienzan con

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

La siguiente línea es un encabezado que comienza 4a) ID del punto del objeto, número de foto, 4b) ID, nombre,

Mi intento de establecer reglas mágicas para esto es:

0 cadena Proyecto\040Unidades:
>2 expresiones regulares ^Objeto\040punto\040ID,Foto\040#, tabla de exportación 2D de PhotoModeler

0 cadena Proyecto\040Unidades:
>2 expresiones regulares ^Id,Nombre, tabla de exportación 3D de PhotoModeler

es decir, haga coincidir 'Unidades de proyecto:' en la primera línea, luego haga un intento de expresión regular hasta un máximo de 2+1 líneas. Ancle la expresión regular al comienzo de la línea para aumentar la velocidad.

Esto está en Ubuntu 14.04, archivo-5.14.

Ejemplo de archivo tipo 1 (solo las primeras 10 líneas):

Unidades de proyecto: metros
Unidades y escala: activo, traducir: activo, rotar: activo

ID de punto de objeto, N.° de foto, X (píxeles), Y (píxeles), X residual, Y residual, Vector residual, Tipo de marca, Capa, Material, Etiquetado
2,1,1429.187065,1456.427823,-0.164541,0.182824,0.245964,circular LSM,predeterminado,blanco,
2,2,666.583514,1126.807078,-0.168174,0.109780,0.200833, circular LSM, predeterminado, blanco,
2,3,716.264669,1196.788962,0.152059,0.082258,0.172882, circular LSM, predeterminado, blanco,
2,4,674.145595,442.969428,0.119315,-0.050084,0.129401, circular LSM, predeterminado, blanco,
2,5,330.056929,836.292587,0.048372,-0.022235,0.053238,circular LSM,predeterminado,blanco,
2,6,1147.101715,39.253316,0.475434,-0.189514,0.511814,circular LSM,predeterminado,blanco,

Ejemplo de archivo tipo 2 (solo las primeras 10 líneas):

Unidades de proyecto: metros
Unidades y escala: activo, traducir: activo, rotar: activo

Id, Nombre, Fotos (usadas), X (unidades de proyecto), Y (unidades de proyecto), Z (unidades de proyecto), Precisión X, Precisión Y, Precisión Z, Longitud vectorial de precisión, Estanqueidad (porcentaje), Estanqueidad (unidades de proyecto) ,Ángulo (grados),Nombre de control,Residual RMS (píxeles),Residual más grande (píxeles),Residual más grande de foto,Material,Capa,Etiquetado,Tipo,Uso en procesamiento,Congelado,#Restricciones,Código de destino,Bits de destino,Ref. . Etiqueta de verificación, Fotos (marcadas), Color (R), Color (G), Color (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,Blanco,Por defecto,Regular,sí,no ,0,n/a,n/a, ," 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,Blanco,Por defecto,Regular,sí,no ,0,n/a,n/a, ," 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,Blanco,Por defecto, /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, Blanco, Predeterminado, Regular, sí, no, 0,n/a,n/a, ,"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,Blanco,Predeterminado,Sí,no,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, Blanco, Predeterminado, Regular, sí, no, 0, n/a, n/a, , "1 ,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21",255,255,255

Respuesta1

Elarchivo(1)La página de manual solo le dice cómo ejecutar el comando. Para obtener una descripción de los patrones mágicos, consultemagia(5). Sin embargo, la sección sobre regexno es especialmente detallada. Se puede encontrar una amplia gama de ejemplos de su uso en los archivos de patrones que lo acompañan: https://github.com/file/file/tree/master/magic/Magdir

Su principal problema fue que es necesario escapar del símbolo de intercalación: \^para el principio de línea, \\^para un literal ^. No he descubierto qué significado especial ^tiene lo que no se ha escapado. También se pueden escapar los espacios, lo que hace que el patrón sea un poco más legible.

Tiene la intención de restringir la coincidencia a un rango de líneas estrecho. regextoma una /<length>opción (después de la palabra regex, no después del patrón), de modo que pone un límite en el lugar donde se realiza la búsqueda.termina. Si la longitud va seguida de l, significa líneas en lugar de bytes. En mis pruebas, /1lsolo puede coincidir con una línea vacía; una línea no vacía, incluso cuando se usa el desplazamiento inicial exacto, requiere al menos /2l.

Para elcomenzarde la búsqueda, offsetse interpreta como un recuento de bytes, incluso con regex. (Antes de la versión 5.19, la documentación sugiere que se interpreta como un "recuento de líneas", pero esa declaración fueremotosin ningún cambio de código coincidente, por lo que dudo que fuera exacto incluso antes de esa fecha). Puede usar offset &0para iniciar la búsqueda desde el final de la coincidencia anterior, pero eso no hará mucha diferencia cuando la coincidencia anterior termine en la mitad de la primera línea.

Además, "comienzo de línea" también coincide con "comienzo del rango de búsqueda" (es decir, desde offset), independientemente de si ese fue el comienzo de una línea en el archivo.

Entonces, para hacer coincidir las cosas de manera más estricta, puede usar una expresión regular de línea completa en cada línea y usar desplazamiento &1en la siguiente coincidencia para omitir la nueva línea anterior y estar en el lugar correcto para que \^funcione como se esperaba. Esto puede resultar excesivo para identificar sus tipos de archivos personalizados.

Finalmente, no es necesario repetir las partes comunes. El nivel de >sangría significa que se debe probar un patrón cuando los patrones anteriores en el mismo nivel fallaron.

Uniendo eso todos juntos:

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

Respuesta2

Una solución se debió a @JigglyNaga: escapar del cursor. El siguiente fragmento ahora forma parte de mi archivo .magic.

0 cadena Proyecto\040Unidades:
>2 expresiones regulares \^Id, tabla de exportación 3D de PhotoModeler

0 cadena Proyecto\040Unidades:
>2 expresiones regulares \^Objeto\040Punto\040ID, tabla de exportación 2D de PhotoModeler

información relacionada