現在のディレクトリに次のパスを持つ.jpgファイルのリストがあります。
./ex.jpg
./ex1234.jpg
./ex4321.jpg
そして、数字を含むものとのみ一致させようとしています正規表現とfind
コマンド。私が実行しているコマンドは次のとおりです。
find . -regextype posix-egrep -regex "\.\/ex\d+\.jpg"
しかし、これは私のディレクトリ内の何にも一致しません。さらに奇妙なのは、次のコマンド(\d+
を\d*
に置き換える)という事実です。
find . -regextype posix-egrep -regex "\.\/ex\d*\.jpg"
出力onlyこれ:
./ex.jpg
-regextype
コマンドを利用可能な他のすべてのオプションに変更してこの正規表現を試しましたが、これは何の影響も与えないようです。
誰かがこの動作を説明できますか?
find
の私のバージョン:(GNU findutils)Ubuntu 16.04.3 LTS for Windows Subsystem for Linuxの4.7.0-git。
\d
(10進数)はPOSIX(またはGNU grep)拡張正規表現(ERE)構文ではサポートされていません-簡単に確認できます:
$ echo 'foo1234bar' | grep -E '\d'
実際、\d
はPerl
に由来し、isはPCRE(Perl互換の正規表現)モードのGNU grepでサポートされています。
$ echo 'foo1234bar' | grep -P '\d'
foo1234bar
ただし、find
ではあまり役に立ちません。知る限りではPCRE regextype
をまだ提供していないので、シンプルな文字範囲[0-9]
を使用する必要があります。および基本正規表現(BRE):
find . -regextype posix-egrep -regex "\.\/ex[0-9]+\.jpg"
\d*\.jpg
がex.jpg
に一致する理由は、\d
がリテラルd
として扱われるためです-そして、ゼロ以上のすべてがすべてに一致します。