Comme vous le savez peut-être déjà, de nombreuses fonctionnalités prises en charge par les moteurs RegEx modernes (référencement arrière, assertions de lookaround, etc.) ne sont pas prises en charge par le moteur Bash RegEx. Voici un simple script Bash que je viens de créer pour essayer d'expliquer quel est mon objectif 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
Ainsi, par exemple, quelque chose comme la commande suivante retournera false:
. match.sh "catfish" "(?=catfish)fish"
tandis que la même expression exacte trouvera une correspondance lorsqu'elle est utilisée dans un testeur Perl ou regex JavaScript.
Les références arrières (par exemple (expr1) (expr2) [] \ 1 \ 2) ne correspondront pas aussi bien.
Je suis simplement arrivé à la conclusion que mon problème ne sera résolu qu'en forçant bash à utiliser un moteur RegEx compatible Perl. Est-ce faisable? Si oui, comment pourrais-je procéder pour exécuter la procédure?
grep
avec -P
ou en utilisant sed
?
re="([a-z])[0-9]\1"; [[ a1a =~ $re ]] && echo ${BASH_REMATCH[0]}