Usando https://regex101.com/ , construí uma expressão regular para retornar a primeira ocorrência de um endereço IP em uma sequência.
RegExp:
(?:\d{1,3}\.)+(?:\d{1,3})
RegExp incluindo delimitadores:
/(?:\d{1,3}\.)+(?:\d{1,3})/
Com a seguinte cadeia de teste:
eu-west 140.243.64.99
Retorna uma correspondência completa de:
140.243.64.99
Não importa o que eu tente com âncoras, etc., o seguinte script bash 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
bash
regular-expression
rjm61
fonte
fonte
=~
operador é discutido aqui no manual, onde está escrito bash usa "expressões regulares estendidas". Regexes estendidas são descritas naregex(7)
página de manual e resumidas aqui .Respostas:
\d
é uma maneira não-padrão de dizer "qualquer dígito". Eu acho que vem do Perl, e muitos outros idiomas e utilitários também suportam REs compatíveis com Perl (PCRE). (e, por exemplo, o GNU grep 2.27 no trecho Debian suporta o mesmo\w
para caracteres de palavras, mesmo no modo normal.)O 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
:fonte
grep
suporta\d
sem-P
?\w
e\b
, que aprendi com Perl, fiquei confuso.\d
ou o PCRE é "fora do padrão". Eles são bastante padrão, apenas um padrão diferente das expressões regulares originais e das expressões regulares estendidas.\d
. Embora você esteja certo, os PCRE são bastante padrão ou menos definidos. A questão irritante é que o GNU grep (ou glibc) suporta alguns átomos do tipo PCRE, pelo menos\w
e\s
ao interpretar o ERE, e nesse contexto eles são muito fora do padrão. Meu fraseado pode vir em parte disso, e a coleta incorreta que\d
foi similarmente suportada pelo GNU.(:...)
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 passados literalmente como em[[ text =~ regexp-here ]]
oposição a como resultado de uma expansão não citada (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 onde
grep -E '\d'
funcionaria (os GNRE EREs já importaram algumas extensões dos regexps perl, como as\s
futuras versões podem ter\d
), você teria que usar:no
bash
para que ele funcione ([[ $text =~ \d ]]
não).Para um shell que suporte PCREs, você pode 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 elas são muito problemáticas quando não o fazem)fonte
O site regex101.com usa o PCRE (veja o canto superior esquerdo) como padrão e não possui suporte para a sintaxe regex "Estendida". Isso é "Expressões regulares compatíveis com Perl", que vêm (como é razoável esperar) do Perl.
O PCRE é suportado por algumas ferramentas (como
grep -P
) em algumas condições, mas o suporte ao regex bash dentro do[[…]]
idioma é apenas para o 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]
:fonte