
以下のファイルがあり、次のように一致させる必要があります。
./foo.bar1.sh -match
./qux/foo.bar2.sh -match
./foo.sh -match
./baz.sh -no match
./foo.bar3 -no match
私が試してみました:
find . -regex ".*foo(bar[0-9])?\.sh"
しかし、何も返されません。なぜその正規表現が機能しないのかわかりません。
答え1
正規表現に 2 つのエラーがあります:
の後の(文字通りの)ドットが抜けています
foo
。find
括弧をエスケープする必要があるない文字通りの括弧として使用されます。
sh
また、は任意の文字と一致するため、の前のドットをエスケープする必要があります。
修正されたコマンドは次のようになります。
find . -regex ".*foo\(\.bar[0-9]\)?\.sh"
ちなみに、エラー 2. は、find
の-regex
スイッチが気に入らない理由です。エスケープが一貫していません。
もちろん動作しますが、grep -P
Perl 互換正規表現 (PCRE) を使用するため、機能は増えますが、驚きや落とし穴は少なくなります。
個人的には、以下を使用します:
find . | grep -P "foo(\.bar\d)?\.sh"