Sé que las expresiones regulares deben usarse solo con caracteres y cadenas, pero a veces las encuentro en los nombres de los archivos. Mi pregunta es: ¿las expresiones regulares solo se usan con caracteres o también con nombres de archivo?
Las expresiones regulares y el bloqueo de nombres de archivos son dos cosas muy diferentes.
Las expresiones regulares se utilizan en comandos / funciones para la coincidencia de patrones en el texto. Por ejemplo en el parámetro de patrón de grep
, o en lenguajes de programación.
Los shells usan el globbing de nombre de archivo para hacer coincidir los nombres de archivo y directorio mediante comodines. Las capacidades de globbing dependen del shell. Bash, por ejemplo, admite comodines como:
*
coincide con 0 o más caracteres?
partido 1 personaje[...]
coincidir con un personaje en el conjunto especificadoEstos comodines pueden ser similares a las expresiones regulares, de hecho [...]
tienen el mismo significado en globbing y regex. Pero *
y ?
significa cosas diferentes en globbing y regex.
En un comentario escribiste:
pero, ¿cómo diferencia el intérprete * si es un comodín o una expresión regular? por ejemplo
grep a*b a*.txt
:?
Fácil. Algo así como.
En primer lugar, el shell intenta interpretar los comodines, comparándolos con los nombres de los archivos. Si hay archivos que comienzan con "a" y terminan con "b", el shell se reemplazará a*b
con los nombres de archivo coincidentes. Lo mismo vale para a*.txt
. Si no hay nombres de archivo coincidentes, el shell pasará los argumentos grep
tal como estaban, literalmente.
Sin embargo, el primer parámetro de grep
debería ser un patrón. En el 99.999% de los casos de uso práctico, no desea que el primer parámetro sea interpretado por el shell. Entonces, lo más probable es que la intención fuera esta:
grep "a*b" a*.txt
Gracias a citar a*b
, la cáscara no interpretará usando globbing, y en lugar de pasar directamente a grep
. A su vez, grep
interpretará eso como una expresión regular (por diseño).
Para resumir, el shell interpreta la línea de comando siguiendo su propio lenguaje global, que utiliza comodines. Comandos, los programas interpretan sus parámetros de cualquier manera que hayan sido diseñados por sus autores.
Si un nombre de archivo es una cadena para usted, puede usar regex también para nombres de archivo. Por ejemplo: si desea encontrar nombres de archivo que coincidan con una expresión regular, puede intentar:
find ./ -regex '.*[abc][xyz].*'
El comando busca archivos que tengan a, b o c en el nombre seguido de x, y o z. Esto es sólo un ejemplo. Hay infinitas posibilidades.
find ./ -name 'a*'
, usa * como comodín. Cuando escribefind ./ -regex 'a*'
, usa * en una expresión regular. La diferencia importante es el interruptor-name
o-regex
.