私は、file
ファイル別に分類されることを意図していない Windows テキスト ファイルをコマンドで検出しようとしています... 行の内容を一致させるために正規表現を使用するのが最善の選択のようですが、その使用例を 1 つも見つけることができません (キーワード「file」、「magic」、および「regex」の共通性は、Google 中心の世界では役に立ちません)。マニュアル ページも役に立ちません。
さらに、^ $ が機能しません。
どちらのファイルも
Project Units: <stuff>
Units & Scale - <stuff>
<blank line>
次の行は、4a) オブジェクトポイント ID、写真番号、4b) ID、名前で始まるヘッダーです。
これに対する私の魔法のルールの試みは次のとおりです。
0 文字列プロジェクト\040単位: >2 正規表現 ^Object\040point\040ID,Photo\040#, PhotoModeler 2D エクスポート テーブル 0 文字列プロジェクト\040単位: >2 正規表現 ^Id、名前、PhotoModeler 3D エクスポート テーブル
つまり、最初の行で「Project Units:」に一致し、最大 2+1 行まで正規表現を試行します。速度を上げるために、正規表現を行の先頭に固定します。
これは Ubuntu 14.04、file-5.14 上にあります。
ファイルタイプ 1 の例 (最初の 10 行のみ):
プロジェクト単位: メートル 単位とスケール - アクティブ、移動 - アクティブ、回転 - アクティブ オブジェクト ポイント ID、写真番号、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 精度、精度ベクトル長、タイトネス (パーセント)、タイトネス (プロジェクト単位)、角度 (度)、コントロール名、RMS 残差 (ピクセル)、最大残差 (ピクセル)、写真の最大残差、材質、レイヤー、タグ、タイプ、処理での使用、固定、#制約、ターゲット コード、ターゲット ビット、参照チェック タグ、写真 (マーク済み)、色 (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
のファイル(1)マニュアルページにはコマンドの実行方法しか記載されていません。マジックパターンの説明については、魔法(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
解決策の 1 つは @JigglyNaga によるもので、キャレットをエスケープします。以下のスニペットは現在、私の .magic ファイルの一部になっています。
0 文字列プロジェクト\040単位: >2 正規表現 \^Id、PhotoModeler 3D エクスポート テーブル 0 文字列プロジェクト\040単位: >2 正規表現 \^Object\040Point\040ID、PhotoModeler 2D エクスポート テーブル