ログファイルからファイルパスを抽出する正規表現

ログファイルからファイルパスを抽出する正規表現

ログファイルからファイルパスを取得する必要があります。私はこれを正規表現で試してみると思いました。

ファイルパスは次のとおりです。

75/751234/751234V0001_test-tag1-tag02-75x75_01.jpg

私は正規表現の専門家ではないので、次の式を使用しなければ2番目のスラッシュに到達できません。また、正規表現でファイル名の先頭を取得しますが、次のキーワードはインポートできません。

([0-9]{2})[\/]([0-9]{2,10})[\/]

これで、実際のファイル名の正規表現はまだありません。ファイル名は常に数字で始まります。それ以降は理論的に無制限のキーワードがあるかもしれません。

ファイル拡張子は.jpg、.tif、.zipなどです。

したがって、出力はファイルパスでなければなりません。

75/751234/751234V0001_test-tag1-tag02-75x75_01.jpg

たぶん、誰かがこれまで持っている正規表現に対する解決策や改善点を持っているかもしれません。

答え1

ファイルパスは次のように構成されているようです。

  • ファイル名は複数の数字で始まります。
  • パスは、番号の最初の2桁を含むディレクトリで始まります。
  • 完全な番号を含むサブディレクトリに進みます。
  • 問題のファイルはこのサブディレクトリに直接配置されており、上記の番号で始まる以外に、限られた可能性の拡張子があります。

ファイル名を含む行を識別する他の方法がある場合は、これがより良い可能性があります。ファイル名のパターンがさまざまで、表示されているパターンに焦点を当てるには、次の正規表現が機能する必要があります(grepEREモードでGNUを使用する例)。

grep -E -w -o '([[:digit:]]{2})/(\1[[:digit:]]+)/\2[^[:digit:]][^/]*\.(jpg|tif|zip)' logfile.txt

これは逆参照(\1および\2)を使用して、「同じテキスト」が文字列の他の場所で一致することを確認します。

  • 文字列は2桁の数字とスラッシュで始まる必要があります。
  • 次に、先頭と同じ2桁の数字、その後に指定されていない数字(数字に固定範囲がある場合は置き換え可能)、およびスラッシュが続く必要があります+{2,10}
  • 次に、2番目のパス要素と同じ番号で始まり、数字以外の文字(数値が実際に2番目のパス要素と同じであることを確認するため)、および/(サブディレクトリ内のファイルを除外するか、同じ行に複数のファイルパスが含まれないようにするために)を除いて、必要に応じて最後の代替ファイル拡張子数を調整できます)。
  • この-oオプションを使用すると、行内の一致する部分(ファイルパスなど)のみが返されます。この-wオプションを使用すると、結果が完全な文字列、つまり潜在的に長いファイルパスの部分文字列と一致しないようにします。これを行うには、ファイル名にスペース(ファイル名に有効な文字)を含めないでください。

厳密に言えば、逆参照は基本正規表現でのみ機能するように機能しますが、オーバーライドは拡張正規表現でのみ機能することを保証します。 GNUgrep拡張正規表現は逆参照を可能にするので、この場合は機能します(おそらくそれほど大きな制限ではありません)。

関連情報