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?
la source
grep
avec-P
ou en utilisantsed
?re="([a-z])[0-9]\1"; [[ a1a =~ $re ]] && echo ${BASH_REMATCH[0]}
Réponses:
Bash ne prend pas en charge une méthode pour ce faire pour le moment. Vous vous retrouvez avec les options suivantes:
grep [-P|--perl-regexp]
Je pense que j'irais avec # 2 et essayerais d'utiliser
grep
pour obtenir ce que je veux fonctionnellement. Pour le référencement arrière, vous pouvez effectuer les opérations suivantes avecgrep
:Références
la source
[-P|--perl-regexp]
jeton. Merci beaucoup :-)-P
option, et ce n'est pas universel. Le grep de FreeBSD est basé sur GNU, mais la documentation indique "Cette option n'est pas prise en charge dans FreeBSD". Dans OSX, grep est également basé sur GNU, mais l'-P
option n'est même pas mentionnée dans la page de manuel. Et sur d'autres systèmes Unix dont grep n'est pas GNU, vous ne verrez probablement pas-P
du tout. S'il y a une possibilité à distance que la portabilité puisse vous être utile à l'avenir, je recommande d'éviter les options spécifiques au système d'exploitation comme celle-ci.pcregrep
est également une option, si disponible.REMATCH_PCRE
option est définie.On pourrait utiliser
pcregrep
. Il est livré avec le packagepcre
dans CentOS etpcregrep
dans Ubuntu.grep -P
pourrait avoir ce problème en fonction de l'OS / version:la source