Forçando Bash a usar o Perl RegEx Engine

7

Como você já deve saber, muitos dos recursos que os modernos mecanismos RegEx suportam (referência anterior, asserção visual, etc.) não são suportados pelo mecanismo Bash RegEx. A seguir, um script simples de Bash que acabei de criar para tentar explicar qual é o 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

Então, por exemplo, algo como o seguinte comando retornará falso:

. 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 corresponderão.

Eu simplesmente cheguei à conclusão de que o meu problema só será resolvido quando forçar o bash a usar um mecanismo RegEx compatível com Perl. Isso é factível? Em caso afirmativo, como eu realizaria o procedimento?

    
por Fadi Hanna AL-Kass 26.07.2013 / 02:57

2 respostas

11

O Bash não suporta um método para você fazer isso no momento. Você ficou com as seguintes opções:

  1. Use Perl
  2. Use grep [-P|--perl-regexp]
  3. Use a funcionalidade Bash para codificá-lo

Eu acho que eu iria com # 2 e tentaria usar grep para conseguir o que eu quero funcionalmente. Para referências anteriores, você pode fazer o seguinte com 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 

Referências

por 26.07.2013 / 08:29
0

Pode-se usar pcregrep . Ele vem com o pacote pcre no CentOS e pcregrep no Ubuntu.

grep -P pode ter esse problema dependendo da versão do SO:

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