Linux найти регулярное выражение - PullRequest
70 голосов
/ 12 апреля 2011

У меня проблемы с использованием регулярного выражения команды find.Возможно, я не понимаю, что такое экранирование в командной строке.

Почему они не совпадают?

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

Bash, Ubuntu

Ответы [ 4 ]

69 голосов
/ 12 апреля 2011

Вы должны взглянуть на аргумент -regextype find, см. 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:]]'
53 голосов
/ 12 апреля 2011

Регулярные выражения с классами символов (например, [[:digit:]]) не поддерживаются в синтаксисе регулярных выражений по умолчанию, используемом find. Вам нужно указать другой тип регулярного выражения, например posix-extended, чтобы использовать их.

Посмотрите на регулярное выражение GNU Find Документация , которая показывает все типы регулярных выражений и их поддержку.

27 голосов
/ 12 апреля 2011

Обратите внимание, что -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]"
1 голос
/ 12 апреля 2011

Ну, вы можете попробовать это '.*[0-9]'

...