web-dev-qa-db-ja.com

-regextype posix-egrepが有効なfindコマンドで\ dメタキャラクターが機能しないのはなぜですか?

現在のディレクトリに次のパスを持つ.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。

2
Esteban Mendoza

\d(10進数)はPOSIX(またはGNU grep)拡張正規表現(ERE)構文ではサポートされていません-簡単に確認できます:

$ echo 'foo1234bar' | grep -E '\d'

実際、\dPerlに由来し、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*\.jpgex.jpgに一致する理由は、\dがリテラルdとして扱われるためです-そして、ゼロ以上のすべてがすべてに一致します。

3
steeldriver