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
grep
con-P
o 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
grep
para obtener lo que quiero funcionalmente. Para las referencias anteriores, puede hacer lo siguiente congrep
:Referencias
fuente
[-P|--perl-regexp]
ficha. Muchas gracias :-)-P
opció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-P
opció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-P
algú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.pcregrep
También es una opción, si está disponible.REMATCH_PCRE
opción esté configurada.Se podría usar
pcregrep
. Viene con el paquetepcre
en CentOS ypcregrep
Ubuntu.grep -P
podría tener este problema dependiendo del sistema operativo / versión:fuente