Forzar a Bash a usar Perl RegEx Engine

Como ya sabrá, el motor Bash RegEx no admite muchas de las características que admiten los motores RegEx modernos (references retrospectivas, aserciones orientativas, etc.). Lo que sigue es un simple script Bash que acabo de crear para tratar de explicar cuál es mi objective 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 command devolverá false:

 . match.sh "catfish" "(?=catfish)fish" 

mientras que la misma expresión exacta encontrará una coincidencia cuando se use en un probador de expresiones regulares de Perl o JavaScript.

Las references posteriores (p. Ej., (Expr1) (expr2) [] \ 1 \ 2) tampoco coincidirán.

Simplemente llegué a la conclusión de que mi problema solo se resolverá cuando forcé a bash a usar un motor RegEx compatible con Perl. ¿Es esto factible? De ser así, ¿cómo realizaría el procedimiento?

Solutions Collecting From Web of "Forzar a Bash a usar Perl RegEx Engine"

Bash no admite un método para que hagas esto en este momento. Te quedan las siguientes opciones:

  1. Use Perl
  2. Use grep [-P|--perl-regexp]
  3. Usa la funcionalidad Bash para codificarlo

Creo que iría con el n. ° 2 e intentaré usar grep para get lo que quiero funcionalmente. Para references anteriores puede hacer lo siguiente con grep :

 $ echo 'BEGIN `helloworld` END' | grep -oP '(?<=BEGIN `).*(?=` END)' helloworld 

 -o, --only-matching show only the part of a line matching PATTERN -P, --perl-regexp PATTERN is a Perl regular expression 

 (?=pattern) is a positive look-ahead assertion (?!pattern) is a negative look-ahead assertion (?<=pattern) is a positive look-behind assertion (?<!pattern) is a negative look-behind assertion 

Referencias

  • Cómo utilizar la reference inversa en Bash

Uno podría usar pcregrep . Viene con el package pcre en CentOS y pcregrep en Ubuntu.

grep -P podría tener este problema dependiendo del sistema operativo / versión:

 -P, --perl-regexp Interpret PATTERN as a Perl regular expression. This is highly experimental and grep -P may warn of unimplemented features.