Ich versuche, den file
Befehl 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 regex
nicht 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. regex
nimmt 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 /1l
kann nur eine leere Zeile übereinstimmen – eine nicht leere Zeile erfordert, selbst bei Verwendung des genauen Startoffsets, mindestens /2l
.
Für dieStartder Suche offset
wird 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, &0
um 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 &1
beim 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