¿Cómo difieren las expresiones regulares de los comodines utilizados para filtrar archivos?

15

Si bien usamos *para denotar cero o más caracteres anteriores grep, usamos *.cpara encontrar todos los archivos C cuando lo usamos con el lscomando like ls *.c. ¿Alguien podría decir cómo *difiere el uso de estos dos casos?

usuario3539
fuente

Respuestas:

30

El nombre de archivo de shell y las expresiones regulares usan algunos de los mismos caracteres, y tienen propósitos similares, pero tienes razón, no son compatibles. El nombre de archivo global es un sistema mucho menos potente.

En el nombre de archivo globbing:

  • * significa "cero o más caracteres"

  • ? significa "cualquier carácter individual"

Pero en expresiones regulares, debe usar .*para significar "cero o más caracteres", y .significa "cualquier carácter individual". A ?significa algo bastante diferente en expresiones regulares: cero o una instancia del elemento RE precedente.

Los corchetes ( []) parecen funcionar de la misma manera en ambos sistemas en el sistema en el que estoy escribiendo esto, al menos en casos simples. Esto incluye cosas como las clases de caracteres POSIX (por ejemplo [:alpha:]). Dicho esto, si necesita que sus comandos funcionen en muchos tipos de sistemas diferentes, le recomiendo no usar nada más allá de elementos elementales como listas de caracteres (por ejemplo [abeq]) y quizás rangos de caracteres (por ejemplo [a-c]).

Estas diferencias significan que los dos sistemas solo son intercambiables directamente para casos simples. Si necesita la coincidencia de expresiones regulares de nombres de archivos, debe hacerlo de otra manera. find -regexEs una opción. (Tenga en cuenta que find -name, por cierto, también existe la sintaxis global).

Warren Young
fuente
2
No sé, se llamó globbing :)
user3539
3
Además, hay varios sabores de expresiones regulares. ¡No todas las expresiones regulares se crean de la misma manera! Y tiene muchos otros sistemas de coincidencia de patrones, tales como SQL como , donde '%'los medios '*'.
Sr. Lister
44
Dos sabores principales de regexp son POSIX y PCRE (Perl Compatible RE). El último tiene menos aliento y tiene algunas características más. Las herramientas y shells de Unix generalmente usan POSIX, la mayoría de los lenguajes de programación con expresiones regulares incorporadas (excepto shell) usan PCRE. Solo tenga cuidado con la diferencia cuando lea material en línea.
Ricitos de oro
11

Respondiendo a la pregunta expresada en el título original:

¿Por qué las expresiones regulares difieren de las utilizadas para filtrar archivos?

La expansión del nombre de archivo es anterior a las expresiones regulares, ya existía con la mayoría de los sistemas operativos (caracteres comodín / comodín) y es mucho más simple e intuitiva que esta última.

Si bien *.txtes fácil de entender por los usuarios ocasionales, lo análogo .*\.txtes algo más dirigido a usuarios / programadores experimentados, sin mencionar ^.*\.txt$...

jlliagre
fuente
2
Otra razón para la parte del "por qué": la velocidad. Las expresiones regulares son más lentas: pastebin.com/3iNCgkE3
manatwork
3
*.txtno es igual .*\.txt, (en su mayoría) es igual .*\.txt$porque no puede haber nada después de .txt(al menos suponiendo un bloqueo de nombre de archivo razonable ). Quizás incluso ^.*\.txt$algo dependiendo del uso. ¿Prueba tu punto?
un CVn el