web-dev-qa-db-ja.com

Linuxは正規表現を見つける

findコマンドの正規表現の使用に問題があります。おそらく、コマンドラインでのエスケープについて私が理解できないことです。

なぜこれらは同じではないのですか?

find -regex '.*[1234567890]'
find -regex '.*[[:digit:]]'

Bash、Ubuntu

70
Dijkstra

文字クラスの正規表現(例:[[:digit:]])は、findで使用されるデフォルトの正規表現構文ではサポートされていません。それらを使用するには、posix-extendedなどの異なる正規表現タイプを指定する必要があります。

GNU Findの正規表現 ドキュメント を見てください。これは、すべての正規表現タイプとそれらがサポートするものを示しています。

53
dogbane

find-regextype引数を見てください。 manpage を参照してください。

      -regextype type
          Changes the regular expression syntax understood by -regex and -iregex 
          tests which occur later on the command line.  Currently-implemented  
          types  are  emacs (this is the default), posix-awk, posix-basic, 
          posix-egrep and posix-extended. 

emacs型は[[:digit:]]コンストラクトをサポートしていないと思います。 posix-extendedで試してみましたが、期待通りに機能しました:

find -regextype posix-extended -regex '.*[1234567890]'
find -regextype posix-extended -regex '.*[[:digit:]]'
69
bmk

-regexはパス全体に依存することに注意してください。

 -regex pattern
              File name matches regular expression pattern.  
              This is a match on the whole path, not a search.

実際にあなたがしていることのために-regexを使用する必要はありません。

find . -iname "*[0-9]"
27
kurumi

さて、あなたはこれを試すことができます'.*[0-9]'

1
StKiller