Como ya sabrá, el motor Bash RegEx no admite muchas de las características que admiten los motores RegEx modernos (referencias anteriores, afirmaciones de búsqueda, etc.). El siguiente es un script Bash simple que acabo de crear para tratar de explicar cuál es mi objetivo final:
#!/bin/bash
# Make sure exactly two arguments are passed.
if [ $# -lt 2 ]
then
echo "Usage: match [string] [pattern]"
return
fi
variable=${1}
pattern=${2}
if [[ ${variable} =~ ${pattern} ]]
then
echo "true"
else
echo "false"
fi
Entonces, por ejemplo, algo como el siguiente comando devolverá falso:
. match.sh "catfish" "(?=catfish)fish"
mientras que la misma expresión exacta encontrará una coincidencia cuando se usa en un Perl o un JavaScript regex tester.
Las referencias posteriores (p. Ej. (Expr1) (expr2) [] \ 1 \ 2) tampoco coincidirán.
Simplemente he llegado a la conclusión de que mi problema solo se resolverá cuando obligue a bash a usar un motor RegEx compatible con Perl. ¿Es esto factible? Si es así, ¿cómo haría para realizar el procedimiento?
fuente

grepcon-Po usarsed?re="([a-z])[0-9]\1"; [[ a1a =~ $re ]] && echo ${BASH_REMATCH[0]}Respuestas:
Bash no admite un método para hacer esto en este momento. Te quedan las siguientes opciones:
grep [-P|--perl-regexp]Creo que iría con el # 2 y trataría de usarlo
greppara obtener lo que quiero funcionalmente. Para las referencias anteriores, puede hacer lo siguiente congrep:Referencias
fuente
[-P|--perl-regexp]ficha. Muchas gracias :-)-Popción, y no es universal. El grep de FreeBSD se basa en GNU, pero la documentación dice "Esta opción no es compatible con FreeBSD". En OSX, grep también se basa en GNU, pero la-Popción ni siquiera se menciona en la página del manual. Y en otros sistemas Unix cuyo grep no es GNU, es poco probable que veas-Palgún lugar. Si existe la posibilidad remota de que la portabilidad pueda serle útil en el futuro, le recomiendo evitar opciones específicas del sistema operativo como esta.pcregrepTambién es una opción, si está disponible.REMATCH_PCREopción esté configurada.Se podría usar
pcregrep. Viene con el paquetepcreen CentOS ypcregrepUbuntu.grep -Ppodría tener este problema dependiendo del sistema operativo / versión:fuente