Si bien usamos *
para denotar cero o más caracteres anteriores grep
, usamos *.c
para encontrar todos los archivos C cuando lo usamos con el ls
comando like ls *.c
. ¿Alguien podría decir cómo *
difiere el uso de estos dos casos?
Si bien usamos *
para denotar cero o más caracteres anteriores grep
, usamos *.c
para encontrar todos los archivos C cuando lo usamos con el ls
comando like ls *.c
. ¿Alguien podría decir cómo *
difiere el uso de estos dos casos?
Respuestas:
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 -regex
Es una opción. (Tenga en cuenta que find -name
, por cierto, también existe la sintaxis global).
'%'
los medios '*'
.
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 *.txt
es fácil de entender por los usuarios ocasionales, lo análogo .*\.txt
es algo más dirigido a usuarios / programadores experimentados, sin mencionar ^.*\.txt$
...
*.txt
no 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?