Usando https://regex101.com/ construí uma expressão regular para retornar a primeira ocorrência de um endereço IP em uma string.
RegExp:
(?:\d{1,3}\.)+(?:\d{1,3})
RegExp incluindo delimitadores:
/(?:\d{1,3}\.)+(?:\d{1,3})/
Com a seguinte string de teste:
eu-west 140.243.64.99
Ele retorna uma correspondência completa de:
140.243.64.99
Não importa o que eu tente com âncoras etc, o script bash a seguir não funcionará com a expressão regular gerada.
temp="eu-west 140.243.64.99 "
regexp="(?:\d{1,3}\.)+(?:\d{1,3})"
if [[ $temp =~ $regexp ]]; then
echo "found a match"
else
echo "No IP address returned"
fi
\d
é uma maneira não padronizada de dizer "qualquer dígito". Acho que vem do Perl, e muitas outras linguagens e utilitários também suportam REs compatíveis com Perl (PCRE). (e, por exemplo, o GNU grep 2.27 no trecho Debian suporta\w
caracteres semelhantes para palavras, mesmo no modo normal.)Bash não suporta
\d
, portanto, você precisa usar explicitamente[0-9]
ou[[:digit:]]
. O mesmo para o grupo de não captura(?:..)
, use apenas(..)
em vez disso.Isso deve imprimir
match
:(:...)
e\d
são operadores de expressão regular perl ou PCRE (como no GNUgrep -P
).bash
suporta apenas expressões regulares estendidas como emgrep -E
exceto que para regexps passadas literalmente como em[[ text =~ regexp-here ]]
oposição a como resultado de uma expansão sem aspas (como em[[ text =~ $var ]]
ou[[ test =~ $(printf '%s\n' 'regexp-here') ]]
), é limitado ao conjunto de recursos de expressão regular estendida POSIX.Portanto, mesmo em sistemas em
grep -E '\d'
que funcionaria (GNU EREs já importaram algumas extensões de perl regexps, como\s
versões futuras\d
também), você teria que usar:para
bash
que funcione ([[ $text =~ \d ]]
não funcionaria).Para um shell que suporta PCREs, você pode querer usar
zsh
:O ksh93 também suporta sua própria implementação de expressões regulares do tipo perl (não totalmente compatíveis) como parte de sua correspondência de padrões. Lá, você usaria:
(observe o
=
em vez de=~
. Você desejará usar variáveis temporárias, pois é muito problemático quando não o faz)O site regex101.com usa PCRE (veja o canto superior esquerdo) como padrão e não tem suporte para a sintaxe regex "Estendida". Isso é "Expressões regulares compatíveis com Perl", que vêm (como é razoável esperar) do Perl.
PCRE é suportado por algumas ferramentas (como
grep -P
) sob algumas condições, mas o suporte bash regex dentro do[[…]]
idioma é apenas para regex estendido (comogrep -E
).No regex estendido, o
(?…)
parêntese de não captura não existe e o \d também está ausente. Você precisa usar simples(…)
e[0-9]
: