magisches Beispiel mit Suche und/oder regulären Ausdrücken

magisches Beispiel mit Suche und/oder regulären Ausdrücken

Ich versuche, den fileBefehl einige Windows-Textdateien erkennen zu lassen, die nie nach Datei klassifiziert werden sollten ... Die beste Lösung scheint die Verwendung von Regex zum Abgleichen des Zeileninhalts zu sein, aber ich kann kein einziges Beispiel für dessen Verwendung finden (die Gemeinsamkeit der Schlüsselwörter „file“, „magic“ und „regex“ hilft in einer Google-zentrierten Welt nicht weiter). Die Manpage hilft nicht weiter.

Darüber hinaus bekomme ich das ^ $ nicht zum Laufen.

Beide Dateien beginnen mit

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

Die nächste Zeile ist eine Überschrift, die mit 4a) Objektpunkt-ID, Foto-Nr., 4b) ID, Name,

Mein Versuch einer magischen Regel hierfür lautet:

0 Zeichenfolge Projekt\040Einheiten:
>2 regex ^Object\040point\040ID,Photo\040#, PhotoModeler 2D-Exporttabelle

0 Zeichenfolge Projekt\040Einheiten:
>2 regex ^Id,Name, PhotoModeler 3D-Exporttabelle

d. h., in der ersten Zeile „Projekteinheiten:“ abgleichen, dann einen Regex-Versuch für maximal 2+1 Zeilen durchführen. Regex zur Beschleunigung am Zeilenanfang verankern.

Dies ist auf Ubuntu 14.04, Datei 5.14.

Beispiel für Dateityp 1 (nur die ersten 10 Zeilen):

Projekteinheiten: Meter
Einheiten und Maßstab - Aktiv, Verschieben - Aktiv, Drehen - Aktiv

Objektpunkt-ID, Foto-Nr., X (Pixel), Y (Pixel), Rest-X, Rest-Y, Rest-Vektor, Markierungstyp, Ebene, Material, Markiert
2,1,1429.187065,1456.427823,-0.164541,0.182824,0.245964,LSM Rund,Standard,Weiß,
2,2,666.583514,1126.807078,-0.168174,0.109780,0.200833,LSM Circular,Standard,Weiß,
2,3,716.264669,1196.788962,0.152059,0.082258,0.172882,LSM Circular,Standard,Weiß,
2,4,674.145595,442.969428,0.119315,-0.050084,0.129401,LSM Rund,Standard,Weiß,
2,5,330.056929,836.292587,0.048372,-0.022235,0.053238,LSM Rund,Standard,Weiß,
2,6,1147.101715,39.253316,0.475434,-0.189514,0.511814,LSM Rund,Standard,Weiß,

Beispiel für Dateityp 2 (nur die ersten 10 Zeilen):

Projekteinheiten: Meter
Einheiten und Maßstab - Aktiv, Verschieben - Aktiv, Drehen - Aktiv

ID, Name, Fotos (verwendet), X (Projekteinheiten), Y (Projekteinheiten), Z (Projekteinheiten), X-Präzision, Y-Präzision, Z-Präzision, Präzisionsvektorlänge, Enge (Prozent), Enge (Projekteinheiten), Winkel (Grad), Steuerelementname, RMS-Rest (Pixel), Größter Rest (Pixel), Größter Rest des Fotos, Material, Ebene, Markiert, Typ, Bei der Verarbeitung verwenden, Eingefroren, Anzahl Einschränkungen, Zielcode, Zielbits, Ref.-Check-Tag, Fotos (markiert), Farbe (R), Farbe (G), Farbe (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,Weiß,Standard, ,Normal,ja,nein,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,Weiß,Standard, ,Normal,ja,nein,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,Weiß,Standard, ,Normal,ja,nein,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,Weiß,Standard, ,Normal,ja,nein,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,Weiß,Standard, ,Normal,ja,nein,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,Weiß,Standard, ,Normal,ja,nein,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

Antwort1

DerDatei(1)Die Manpage erklärt Ihnen nur, wie Sie den Befehl ausführen. Eine Beschreibung der magischen Muster finden Sie unterMagie(5). Der Abschnitt über ist jedoch regexnicht besonders ausführlich. Eine Vielzahl von Anwendungsbeispielen finden Sie in den mitgelieferten Musterdateien: https://github.com/file/file/tree/master/magic/Magdir

Ihr Hauptproblem war, dass das Cursorzeichen maskiert werden muss: \^für den Zeilenanfang, \\^für ein Literal ^. Ich habe noch nicht herausgefunden, welche besondere Bedeutung das Nichtmaskieren ^hat. Leerzeichen können ebenfalls maskiert werden, wodurch das Muster etwas lesbarer wird.

Sie möchten die Übereinstimmung auf einen engen Zeilenbereich beschränken. regexnimmt eine /<length>Option an (nach dem Wort regex, nicht nach dem Muster), sodass die Suche eingeschränkt wird.endet. Wenn der Länge ein folgt l, bedeutet dies Zeilen statt Bytes. In meinen Tests /1lkann nur eine leere Zeile übereinstimmen – eine nicht leere Zeile erfordert, selbst bei Verwendung des genauen Startoffsets, mindestens /2l.

Für dieStartder Suche offsetwird als Byteanzahl interpretiert, auch mit regex. (Vor Version 5.19 deutet die Dokumentation an, dass es als „Zeilenanzahl“ interpretiert wird, aber diese Aussage warENTFERNTohne entsprechende Codeänderung, daher bezweifle ich, dass es schon vorher korrekt war.) Sie könnten einen Offset verwenden, &0um die Suche am Ende der vorherigen Übereinstimmung zu starten, aber das macht keinen großen Unterschied, wenn die vorherige Übereinstimmung in der Mitte der ersten Zeile endete.

Darüber hinaus entspricht „Zeilenanfang“ auch „Anfang des Suchbereichs“ (also ab offset), unabhängig davon, ob dies der Anfang einer Zeile in der Datei war.

Um die Übereinstimmung strenger zu gestalten, könnten Sie für jede Zeile einen regulären Ausdruck verwenden und &1beim nächsten Treffer einen Offset verwenden, um die vorherige neue Zeile zu überspringen und an der richtigen Stelle zu sein, damit es \^wie erwartet funktioniert. Dies ist möglicherweise übertrieben, wenn Sie Ihre benutzerdefinierten Dateitypen identifizieren möchten.

Schließlich müssen Sie die gemeinsamen Teile nicht wiederholen. Die Einrückungsebene >bedeutet, dass ein Muster ausprobiert werden soll, wenn vorherige Muster auf derselben Ebene fehlgeschlagen sind.

Alles zusammen:

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

Antwort2

Eine Lösung war auf @JigglyNaga zurückzuführen – das Zirkumflex vermeiden. Der folgende Snippet ist jetzt Teil meiner .magic-Datei.

0 Zeichenfolge Projekt\040Einheiten:
>2 regex \^Id, PhotoModeler 3D-Exporttabelle

0 Zeichenfolge Projekt\040Einheiten:
>2 regex \^Object\040Point\040ID, PhotoModeler 2D-Exporttabelle

verwandte Informationen