Come forse già saprai, molte delle funzionalità supportate dai moderni motori RegEx (riferimenti secondari, asserzioni lookaround, ecc.) Non sono supportate dal motore Bash RegEx. Di seguito è riportato un semplice script Bash che ho appena creato per cercare di spiegare qual è il mio obiettivo finale:
#!/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
Ad esempio, qualcosa come il seguente comando restituirà false:
. match.sh "catfish" "(?=catfish)fish"
mentre la stessa identica espressione troverà una corrispondenza quando usata in un tester regex Perl o JavaScript.
Anche i backreferences (ad es. (Expr1) (expr2) [] \ 1 \ 2) non corrispondono.
Sono semplicemente giunto alla conclusione che il mio problema sarà risolto solo quando costringo Bash a utilizzare un motore RegEx compatibile con Perl. È fattibile? In tal caso, come farei per eseguire la procedura?
grep
con -P
o utilizzando sed
?
re="([a-z])[0-9]\1"; [[ a1a =~ $re ]] && echo ${BASH_REMATCH[0]}