Me pregunto cuál es la regla general para usar expresiones regulares en la cláusula if en bash.
Aquí hay un ejemplo
$ gg=svm-grid-ch
$ if [[ $gg == *grid* ]] ; then echo $gg; fi
svm-grid-ch
$ if [[ $gg == ^....grid* ]] ; then echo $gg; fi
$ if [[ $gg == ....grid* ]] ; then echo $gg; fi
$ if [[ $gg == s...grid* ]] ; then echo $gg; fi
$
¿Por qué los tres últimos no coinciden?
Espero que pueda dar tantas reglas generales como sea posible, no solo para este ejemplo.
Utilizar
=~
para ver las expresiones regulares Tabla de contenido del tutorial de expresiones regulares
fuente
if [[ $gg =~ ^....grid.* ]]
fuente
Agregar esta solución con incorporaciones
grep
básicassh
para aquellos interesados en una solución más portátil (independiente de labash
versión; también funciona con versiones antiguassh
, en plataformas que no son Linux, etc.)# GLOB matching gg=svm-grid-ch case "$gg" in *grid*) echo $gg ;; esac # REGEXP if echo "$gg" | grep '^....grid*' >/dev/null ; then echo $gg ; fi if echo "$gg" | grep '....grid*' >/dev/null ; then echo $gg ; fi if echo "$gg" | grep 's...grid*' >/dev/null ; then echo $gg ; fi # Extended REGEXP if echo "$gg" | egrep '(^....grid*|....grid*|s...grid*)' >/dev/null ; then echo $gg fi
Algunas
grep
encarnaciones también admiten la-q
opción (silenciosa) como alternativa a la redirección/dev/null
, pero la redirección es nuevamente la más portátil.fuente
grep -q
lugar degrep >/dev/null
.@OP,
No, el patrón "glob" no solo se usa para los nombres de archivo. también puedes usarlo para comparar cadenas. En sus ejemplos, puede usar case / esac para buscar patrones de cadenas.
gg=svm-grid-ch # looking for the word "grid" in the string $gg case "$gg" in *grid* ) echo "found";; esac # [[ $gg =~ ^....grid* ]] case "$gg" in ????grid*) echo "found";; esac # [[ $gg =~ s...grid* ]] case "$gg" in s???grid*) echo "found";; esac
Las expresiones regulares son más versátiles y "convenientes" que los "patrones glob", sin embargo, a menos que esté realizando tareas complejas que "globbing / globbing extendido" no puede proporcionar fácilmente, entonces no es necesario utilizar regex. Las expresiones regulares no son compatibles con la versión de bash <3.2 (como mencionó dennis), pero aún puede usar globbing extendido (por configuración
extglob
). para el globbing extendido, vea aquí y algunos ejemplos simples aquí .Actualización para OP: Ejemplo para buscar archivos que comienzan con 2 caracteres (los puntos "." Significa 1 carácter) seguidos de "g" usando expresiones regulares
por ejemplo, salida
$ shopt -s dotglob $ ls -1 * abg degree ..g $ for file in *; do [[ $file =~ "..g" ]] && echo $file ; done abg degree ..g
En lo anterior, los archivos coinciden porque sus nombres contienen 2 caracteres seguidos de "g". (es decir
..g
).El equivalente con globbing será algo como esto: (busque en la referencia el significado de
?
y*
)$ for file in ??g*; do echo $file; done abg degree ..g
fuente
ls ..g
no funciona. Le está diciendo al shell que busque un archivo con nombre..g
. En cuanto a aprender acerca de la sintaxis de expresiones regulares, se puede tratarperldoc perlretut
,perldoc perlrequick
o hacer unainfo sed
en la línea de comandos.