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?
grep
con -P
o usar sed
?
re="([a-z])[0-9]\1"; [[ a1a =~ $re ]] && echo ${BASH_REMATCH[0]}