Expresiones regulares VS Filename globbing


15

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?

Respuestas:


19

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 especificado

Estos 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*bcon los nombres de archivo coincidentes. Lo mismo vale para a*.txt. Si no hay nombres de archivo coincidentes, el shell pasará los argumentos greptal como estaban, literalmente.

Sin embargo, el primer parámetro de grepdeberí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, grepinterpretará 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.


4

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.


pero, ¿cómo diferencia el intérprete * si es un comodín o una expresión regular? por ejemplo: $ grep a "asterix" b a "asterix" .txt
Hamza

2
Si usa find ./ -name 'a*', usa * como comodín. Cuando escribe find ./ -regex 'a*', usa * en una expresión regular. La diferencia importante es el interruptor -nameo -regex.
nadie
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.