Como você já deve saber, muitos dos recursos que os mecanismos modernos RegEx suportam (referência posterior, asserções de pesquisa etc.) não são suportados pelo mecanismo Bash RegEx. A seguir, é apresentado um script Bash simples que acabei de criar para tentar explicar qual é 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
Por exemplo, algo como o seguinte comando retornará false:
. 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 serão correspondentes.
Acabei de concluir que meu problema só será resolvido ao forçar o bash a usar um mecanismo RegEx compatível com Perl. Isso é factível? Se sim, como eu realizaria o procedimento?
fonte
grep
com-P
ou usandosed
?re="([a-z])[0-9]\1"; [[ a1a =~ $re ]] && echo ${BASH_REMATCH[0]}
Respostas:
O Bash não suporta um método para você fazer isso no momento. Você tem as seguintes opções:
grep [-P|--perl-regexp]
Eu acho que iria com o # 2 e tentaria usar
grep
para obter o que quero funcionalmente. Para referência remota, você pode fazer o seguinte comgrep
:Referências
fonte
[-P|--perl-regexp]
token. Muito obrigado :-)-P
opção, e não é universal. O grep do FreeBSD é baseado no GNU, mas a documentação declara "Esta opção não é suportada no FreeBSD". No OSX, o grep também é baseado no GNU, mas a-P
opção nem é mencionada na página do manual. E em outros sistemas unix cujo grep não é GNU, é improvável que você veja em-P
qualquer lugar. Se houver a possibilidade remota de que a portabilidade possa ser útil para você no futuro, recomendo evitar opções específicas do sistema operacional como esta.pcregrep
também é uma opção, se disponível.REMATCH_PCRE
opção esteja definida.Pode-se usar
pcregrep
. Ele vem com o pacotepcre
no CentOS epcregrep
no Ubuntu.grep -P
pode ter esse problema dependendo do sistema operacional / versão:fonte