次の正規表現の検索が Linux で機能しないのはなぜですか?

次の正規表現の検索が Linux で機能しないのはなぜですか?

特定のパターンに一致するファイルを見つけようとしていますが、パターンに一致するはずのファイルがあるにもかかわらず、以下のコマンドを実行しようとすると結果が返されません。

find . -maxdepth 1 -regextype posix-extended -regex ".*/s_[a-zA-Z]_[a-zA-Z]\.png" -exec echo {} \;

.*/パス全体に一致することはわかっていますが、それが正確に何を意味するのかよくわかりません。

一致する必要があるファイルには、例えば次のようなものがあります。

  1. s_choose_blue.png
  2. s_choose_red.png
  3. s_new_blue.png

答え1

正規表現の実際の問題は、一致すべきものと一致しないことです。分解すると次のようになります。

  • .*/– 任意の文字を複数回繰り返し、その後にスラッシュを続けます。これは基本的に、実際のファイル名の前のディレクトリ リストを消費するため、文字通り一致します./(例のように)。また./some/other/dir/、最後のスラッシュまで一致します。

    これが機能するのは、正規表現がデフォルトで「貪欲」であるためです。つまり、可能な限り一致することを意味します。本質的には、この部分では、実際のファイル名のみを検索し、結果からパスを削除できます。

    まとめると、.*/実際のファイル名だけを知りたい場合は正規表現の前に が必要です。ファイルへのパスの一部も一致させる必要がある場合は、 は使用できません。.*/

  • s_– これはあなたの例ではうまく機能します

  • [a-zA-Z]– これは消費するだけです1つこのクラスのキャラクター

  • _– アンダースコアが続く

  • [a-zA-Z]– 再び続いて1つキャラクター

  • \.png– ドットと拡張子を文字通り一致させる

したがって、正規表現を次のように変更する必要があります。

.*/s_[a-zA-Z]+_[a-zA-Z]+\.png

を使用する必要があります+。これは基本的に、前のものの 1 つまたは複数を意味します。

関連情報