¿Por qué la siguiente expresión regular de búsqueda no funciona en Linux?

¿Por qué la siguiente expresión regular de búsqueda no funciona en Linux?

Estoy intentando localizar archivos que coincidan con un patrón particular, sin embargo, intentar ejecutar el siguiente comando no arroja resultados a pesar de que hay archivos que deberían coincidir con el patrón.

find . -maxdepth 1 -regextype posix-extended -regex ".*/s_[a-zA-Z]_[a-zA-Z]\.png" -exec echo {} \;

Sé que .*/coincide con todo el camino, pero no entiendo muy bien qué significa exactamente.

Los archivos que tiene que coincidir, por ejemplo, incluyen

  1. s_elegir_azul.png
  2. s_elegir_rojo.png
  3. s_nuevo_azul.png

Respuesta1

El problema real con su expresión regular es que no coincide con lo que se supone que debe coincidir. Para desglosarlo:

  • .*/– cualquier carácter, varias veces, seguido de una barra. Básicamente, esto consume la lista de directorios antes del nombre del archivo real, por lo que coincidiría literalmente ./(como en su ejemplo), pero también ./some/other/dir/hasta la última barra.

    Esto funciona porque las expresiones regulares son "codiciosas" de forma predeterminada, lo que significa que coinciden tanto como pueden. En esencia, esta parte le permite simplemente buscar el nombre del archivo real y eliminar la ruta del resultado.

    Para resumir, necesita el .*/frente de la expresión regular si lo único que le importa es el nombre del archivo real. Si también necesita hacer coincidir algunas partes de la ruta con el archivo, no puede usar.*/

  • s_– esto funciona bien en tu ejemplo

  • [a-zA-Z]– esto solo consumeunopersonaje de esta clase

  • _– seguido de un guión bajo

  • [a-zA-Z]– nuevamente seguido porunopersonaje

  • \.png– hacer coincidir literalmente el punto y la extensión

Entonces, debes cambiar tu expresión regular a:

.*/s_[a-zA-Z]+_[a-zA-Z]+\.png

Tendrás que usar el +, que básicamente dice uno o varios de los anteriores.

información relacionada