exemplo mágico usando pesquisa e/ou regex

exemplo mágico usando pesquisa e/ou regex

Estou tentando fazer com que o filecomando detecte alguns arquivos de texto do Windows que nunca deveriam ser classificados por arquivo... A melhor opção parece usar regex para corresponder ao conteúdo da linha, mas não consigo encontrar um único exemplo de seu uso (a semelhança das palavras-chave 'file', 'magic' e 'regex' não ajuda em um mundo centrado no Google). A página de manual não ajuda.

Além disso, não consigo fazer o ^ $ funcionar.

Ambos os arquivos começam com

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

A próxima linha é um cabeçalho que começa com 4a) ID do ponto do objeto, Foto #, 4b) Id, Nome,

Minha tentativa de regras mágicas para isso é:

0 string Projeto\040Unidades:
>2 regex ^Object\040point\040ID,Photo\040#, tabela de exportação 2D do PhotoModeler

0 string Projeto\040Unidades:
>2 regex ^Id,Nome, tabela de exportação 3D do PhotoModeler

ou seja, combine 'Unidades do Projeto:' na primeira linha e, em seguida, faça uma tentativa de regex com no máximo 2 + 1 linhas. Ancorar regex no início da linha para aumentar a velocidade.

Isso está no Ubuntu 14.04, arquivo-5.14.

Exemplo de arquivo tipo 1 (apenas as primeiras 10 linhas):

Unidades do Projeto: metros
Unidades e Escala - Ativo, Traduzir - Ativo, Girar - Ativo

ID do ponto do objeto, número da foto, X (pixels), Y (pixels), X residual, Y residual, Vetor residual, Tipo de marca, Camada, Material, Marcado
2,1,1429.187065,1456.427823,-0,164541,0,182824,0,245964, LSM Circular, Padrão, Branco,
2,2.666.583514,1126.807078,-0,168174,0,109780,0,200833, LSM Circular, Padrão, Branco,
2,3.716.264669,1196.788962,0,152059,0,082258,0,172882, LSM Circular, Padrão, Branco,
2,4.674.145595,442.969428,0,119315,-0,050084,0,129401, LSM Circular, Padrão, Branco,
2,5,330,056929,836,292587,0,048372,-0,022235,0,053238, LSM Circular, Padrão, Branco,
2,6,1147.101715,39.253316,0,475434,-0,189514,0,511814, LSM Circular, Padrão, Branco,

Exemplo de arquivo tipo 2 (apenas as primeiras 10 linhas):

Unidades do Projeto: metros
Unidades e Escala - Ativo, Traduzir - Ativo, Girar - Ativo

Id,Nome,Fotos (usadas),X (unidades de projeto),Y (unidades de projeto),Z (unidades de projeto),Precisão X,Precisão Y,Precisão Z,Comprimento do vetor de precisão,Estanqueidade (porcentagem),Estanqueidade (unidades de projeto) , Ângulo (graus), Nome do controle, Residual RMS (pixels), Maior resíduo (pixels), Maior resíduo da foto, Material, Camada, Marcado, Tipo, Uso em processamento, Congelado, # Restrições, Código de destino, Bits de destino, Ref. . Etiqueta de verificação, fotos (marcadas), cor (R), cor (G), cor (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, Branco, Padrão, Regular, sim, não ,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, Branco, Padrão, Regular, sim, não ,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, Branco, Padrão, Regular, sim, não,0,n/a,n /uma,,"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, Branco, Padrão, Regular, sim, não, 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,Branco,Padrão,,Regular,sim,não,0,n/a,n /uma,,"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, Branco, Padrão, Regular, sim, não, 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

Responder1

Oarquivo(1)A página de manual apenas informa como executar o comando. Para uma descrição dos padrões mágicos, consultemagia (5). No entanto, a seção sobre regexnão é especialmente detalhada. Uma ampla variedade de exemplos de seu uso pode ser encontrada nos arquivos de padrão que o acompanham: https://github.com/file/file/tree/master/magic/Magdir

Seu principal problema foi que o cursor precisa escapar: \^para início de linha, \\^para literal ^. Ainda não descobri que significado especial ^tem o não escapado. Os espaços também podem ser escapados, tornando o padrão um pouco mais legível.

Você pretende restringir a correspondência a um intervalo de linhas estreito. regexpega uma /<length>opção (depois da palavra regex, não depois do padrão), de modo que coloca um limite onde a pesquisatermina. Se o comprimento for seguido por um l, significa linhas em vez de bytes. Em meus testes, /1lsó é possível corresponder a uma linha vazia - uma linha não vazia, mesmo ao usar o deslocamento inicial exato, requer pelo menos /2l.

Para ocomeçarda pesquisa, offseté interpretado como uma contagem de bytes, mesmo com regex. (Pré-versão 5.19, a documentação sugere que seja interpretada como uma "contagem de linhas", mas essa afirmação foiremovidosem alteração de código correspondente, então duvido que fosse preciso mesmo antes disso.) Você poderia usar o deslocamento &0para iniciar a pesquisa a partir do final da partida anterior, mas isso não fará muita diferença quando a partida anterior terminar em no meio da primeira linha.

Além disso, "início da linha" também corresponde ao "início do intervalo de pesquisa" (ou seja, de offset), independentemente de ser o início de uma linha no arquivo.

Portanto, para combinar as coisas de maneira mais estrita, você pode usar um regexp de linha completa em cada linha e usar o deslocamento &1na próxima correspondência, para pular a nova linha anterior e estar no lugar certo para \^funcionar conforme o esperado. Isso pode ser um exagero para identificar seus tipos de arquivos personalizados.

Finalmente, você não precisa repetir as partes comuns. O nível de >indentação significa que um padrão deve ser tentado quando padrões anteriores no mesmo nível falharam.

Juntando tudo isso:

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

Responder2

Uma solução foi atribuída a @JigglyNaga - escapar do cursor. O trecho abaixo agora faz parte do meu arquivo .magic.

0 string Projeto\040Unidades:
>2 regex \^Id, tabela de exportação 3D do PhotoModeler

0 string Projeto\040Unidades:
>2 regex \^Object\040Point\040ID, tabela de exportação 2D do PhotoModeler

informação relacionada