Como você já deve saber, muitos dos recursos que os mecanismos modernos RegEx suportam (referência posterior, asserções de pesquisa etc.) não são suportados pelo mecanismo Bash RegEx. A seguir, é apresentado um script Bash simples que acabei de criar para tentar explicar qual é meu 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
Por exemplo, algo como o seguinte comando retornará false:
. match.sh "catfish" "(?=catfish)fish"
enquanto a mesma expressão exata encontrará uma correspondência quando usada em um testador de regex Perl ou JavaScript.
As referências anteriores (por exemplo, (expr1) (expr2) [] \ 1 \ 2) também não serão correspondentes.
Acabei de concluir que meu problema só será resolvido ao forçar o bash a usar um mecanismo RegEx compatível com Perl. Isso é factível? Se sim, como eu realizaria o procedimento?
grep
com -P
ou usando sed
?
re="([a-z])[0-9]\1"; [[ a1a =~ $re ]] && echo ${BASH_REMATCH[0]}