2011-04-12 23 views
69

Tengo problemas para usar la expresión regular del comando find. Probablemente sea algo que no entiendo sobre escapar en la línea de comando.linux find regex

¿Por qué no son iguales?

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

Bash, Ubuntu

+0

¿Qué salida debe indicar que no es? – shellter

Respuesta

50

expresiones regulares con clases de personajes (por ejemplo [[:digit:]]) no son compatibles con la sintaxis de expresiones regulares por defecto utilizado por find. Necesita especificar un tipo de expresión regular diferente como posix-extended para poder usarlos.

Eche un vistazo a la Expresión regular de GNU Find documentation que le muestra todos los tipos de expresiones regulares y lo que admiten.

+0

Gracias. Ese documento es el que debería haber estado buscando. Todo lo que pude encontrar fue http://www.gnu.org/software/emacs/manual/html_node/elisp/Char-Classes.html#Char-Classes, lo que parecía sugerir que las clases de caracteres * eran * compatibles con "emacs regex" modo". – Dijkstra

+1

También verifique [Regular_expression # Character_classes] (http://en.wikipedia.org/wiki/Regular_expression#Character_classes) - recurso muy útil – asoundmove

67

Usted debe tener una mirada en el argumento de -regextypefind, ver 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. 

supongo que el tipo emacs no es compatible con el constructo [[:digit:]]. Lo he probado con posix-extended y funcionó como se esperaba:

find -regextype posix-extended -regex '.*[1234567890]' 
find -regextype posix-extended -regex '.*[[:digit:]]' 
+2

Pensé que podría ser eso, pero verifiqué las definiciones de expresiones regulares de emacs y parecen ser compatibles con [: digit:]. http://www.gnu.org/software/emacs/manual/html_node/elisp/Char-Classes.html#Char-Classes – Dijkstra

2

Bueno, puede probar este '.*[0-9]'

+3

esta no es una respuesta a su pregunta; simplemente reescribió su expresión regular ... –

27

Tenga en cuenta que -regex depende de ruta entera.

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

En realidad no tiene que utilizar -regex de lo que está haciendo.

find . -iname "*[0-9]" 
+2

El punto excplicit no es necesario aquí, también;) –