Linux найти регулярное выражение
У меня возникли проблемы с использованием регулярного выражения команды find
. Возможно, что-то я не понимаю об экранировании в командной строке.
Почему они не то же самое?
find -regex '.*[1234567890]'
find -regex '.*[[:digit:]]'
Bash, Ubuntu
Ответы
Ответ 1
Регулярные выражения с символьными классами (например, [[:digit:]]
) не поддерживаются в синтаксисе регулярных выражений по умолчанию, используемом find
. Для их использования вам нужно указать другой тип регулярного выражения, например posix-extended
.
Взгляните на GNU Find Regular Expression документация, которая показывает вам все типы регулярных выражений и то, что они поддерживают.
Ответ 2
Вы должны посмотреть на аргумент -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:]]'
Ответ 3
Обратите внимание, что -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]"
Ответ 4
Хорошо, вы можете попробовать этот '.*[0-9]'