Mientras usamos *
para indicar cero o más caracteres anteriores en grep
, usamos *.c
para encontrar todos los archivos C cuando lo usamos con ls
comando como ls *.c
. ¿Alguien podría decir cómo el uso de *
difiere en estos dos casos?
Respuesta aceptada:
El nombre de archivo de shell y las expresiones regulares usan algunos de los mismos caracteres y tienen propósitos similares, pero tiene razón, no son compatibles. El englobamiento de nombres de archivos es un sistema mucho menos poderoso.
En 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”. ¿Un ?
significa algo bastante diferente en expresiones regulares:cero o una instancia del elemento RE anterior.
Corchetes ([]
) parecen funcionar igual en ambos sistemas en el sistema en el que estoy escribiendo esto, al menos para casos simples. Esto incluye cosas como clases de caracteres POSIX (por ejemplo, [:alpha:]
). Dicho esto, si necesita que sus comandos funcionen en muchos tipos de sistemas diferentes, le recomiendo que no use nada más allá de cosas 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 directamente intercambiables para casos simples. Si necesita la coincidencia de expresiones regulares de los nombres de archivo, debe hacerlo de otra manera. find -regex
es una opción (Observe que también hay find -name
, por cierto, que usa sintaxis glob.)