волшебный пример с использованием поиска и/или регулярных выражений

волшебный пример с использованием поиска и/или регулярных выражений

Я пытаюсь заставить fileкоманду обнаружить некоторые текстовые файлы Windows, которые никогда не предполагалось классифицировать по файлу... Лучшим выбором, похоже, будет использование регулярных выражений для сопоставления содержимого строки, но я не могу найти ни одного примера его использования (общность ключевых слов «file», «magic» и «regex» не помогает в мире, ориентированном на Google). Страница руководства не помогает.

Более того, я не могу заставить работать ^ $.

Оба файла начинаются с

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

Следующая строка — заголовок, который начинается с 4a) Идентификатор точки объекта, Номер фотографии, 4b) Идентификатор, Имя,

Моя попытка создать магические правила для этого такова:

0 строка Project\040Единицы:
>2 регулярных выражения ^Object\040point\040ID,Photo\040#, таблица экспорта PhotoModeler 2D

0 строка Project\040Единицы:
>2 регулярных выражения ^Id,Name, таблица экспорта PhotoModeler 3D

т. е. сопоставьте «Project Units:» в первой строке, затем выполните попытку регулярного выражения максимум для 2+1 строк. Привяжите регулярное выражение к началу строки для скорости.

Это на Ubuntu 14.04, файл-5.14.

Пример файла типа 1 (только первые 10 строк):

Единицы измерения проекта: метры
Единицы измерения и масштаб - Активный, Перемещение - Активный, Поворот - Активный

Идентификатор точки объекта, Номер фотографии, 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, Точность Длина вектора, Плотность (процент), Плотность (единицы проекта), Угол (град.), Имя элемента управления, Среднеквадратический остаток (пиксели), Наибольший остаток (пиксели), Наибольший остаток фотографии, Материал, Слой, Помечено, Тип, Использовать при обработке, Заморожено, # Ограничения, Целевой код, Целевые биты, Тег проверки ссылок, Фотографии (отмечены), Цвет (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,н/д,н/д, ,"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, н / д, н / д, ,"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

Theфайл(1)manpage только рассказывает, как запустить команду. Описание магических шаблонов см.магия(5). Однако раздел regexне особенно подробен. Широкий спектр примеров его использования можно найти в файлах шаблонов, которые идут вместе с ним: https://github.com/file/file/tree/master/magic/Magdir

Ваша главная проблема была в том, что каретка нуждается в экранировании: \^для начала строки, \\^для литерала ^. Я не понял, какое особое значение ^имеет неэкранированное. Пробелы также можно экранировать, что делает шаблон немного более читабельным.

Вы намереваетесь ограничить совпадение узким диапазоном строк. regexпринимает /<length>опцию (после слова regex, а не после шаблона), поэтому это накладывает ограничение на то, где будет выполняться поискзаканчивается. Если за длиной следует l, это означает строки вместо байтов. В моих тестах /1lможет соответствовать только пустой строке — непустая строка, даже при использовании точного начального смещения, требует как минимум /2l.

Дляначинатьпоиска, offsetинтерпретируется как количество байтов, даже с regex. (До версии 5.19 документация предполагает, что это интерпретируется как «количество строк», но это утверждение былоудаленный(без изменения кода сопоставления, поэтому я сомневаюсь, что он был точным даже до этого.) Вы можете использовать смещение, &0чтобы начать поиск с конца предыдущего совпадения, но это не будет иметь большого значения, если предыдущее совпадение закончилось в середине первой строки.

Более того, «начало строки» также соответствует «началу диапазона поиска» (т. е. с offset), независимо от того, было ли это началом строки в файле.

Поэтому для более строгого соответствия вы можете использовать регулярное выражение полной строки для каждой строки и использовать смещение &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 строка Project\040Единицы:
>2 regex \^Id, таблица экспорта PhotoModeler 3D

0 строка Project\040Единицы:
>2 регулярных выражения \^Object\040Point\040ID, таблица экспорта PhotoModeler 2D

Связанный контент