検索および/または正規表現を使用した素晴らしい例

検索および/または正規表現を使用した素晴らしい例

ファイルごとに並べ替える意図がまったくないいくつかのWindowsテキストファイルを検出するコマンドを取得しようとしていますfile...最良のオプションは、正規表現を使用して行の内容を一致させるようですが、次のような例もありません。その使用(共通キーワード「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エクスポートテーブル

つまり、最初の行で「項目単位:」と一致し、正規表現を試して最大2 + 1行に達します。速度を上げるには、正規表現を行の先頭に固定します。

これはUbuntu 14.04、ファイル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.5該当なし、該当なし該当、、” 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.222886,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 /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 ,該当なし,,"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 /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,5,6 ,該当なし,,"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

\^主な問題は、行の先頭から\\^文字通りキャレットをエスケープする必要があることです^。私は^unscapedの特別な意味が何であるかを知りませんでした。パターンを読みやすくするためにスペースをエスケープすることもできます。

狭い範囲の行に一致を制限しようとしています。オプション(パターンの後ろではなく単語の後ろ)をregex許可して検索位置を制限します。/<length>regex終わる。後に length が続く場合は、lバイトではなく行を意味します。私のテストでは、空/1l行だけを一致させることができます。空でない行は、正確な開始オフセットがあっても少なくとも/2l

~のためスタート(バージョン5.19より前には文書に「行数」と解釈されると述べていますが、そのoffset文はregex削除済み一致するコードの変更がないので、それ以前は正しいかどうか疑われます。 )前の一致項目の終わりから検索を開始するにはオフセットを使用できますが&0、前の一致項目が最初の行の途中で終わる場合には大きな違いはありません。

offsetまた、「行の開始」は、これがファイルの行の開始かどうかに関係なく、「検索範囲の開始」(例:from)とも一致します。

したがって、より厳密に一致させるには、各行に完全行正規表現を使用し、次の一致にオフセットを使用して前の改行をスキップして期待どおりに機能するように&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 エクスポートテーブル

関連情報