Usando https://regex101.com/ Construí una expresión regular para devolver la primera aparición de una dirección IP en una cadena.
RegExp:
(?:\d{1,3}\.)+(?:\d{1,3})
RegExp incluyendo delimitadores:
/(?:\d{1,3}\.)+(?:\d{1,3})/
Con la siguiente cadena de prueba:
eu-west 140.243.64.99
Devuelve una coincidencia completa de:
140.243.64.99
No importa lo que intente con los anclajes, etc., el siguiente script bash no funcionará con la expresión regular generada.
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
fuente
fuente
=~
operador se trata aquí en el manual donde está escrito bash usa "expresiones regulares extendidas". Las expresiones regulares extendidas se describen en laregex(7)
página del manual y se resumen brevemente aquí .Respuestas:
\d
es una forma no estándar de decir "cualquier dígito". Creo que proviene de Perl, y muchos otros lenguajes y utilidades también admiten RE compatibles con Perl (PCRE). (y, por ejemplo, GNU grep 2.27 en Debian stretch admite\w
caracteres similares para palabras incluso en modo normal).Sin
\d
embargo, Bash no es compatible , por lo que debe usar explícitamente[0-9]
o[[:digit:]]
. Lo mismo para el grupo que no captura(?:..)
, use solo en su(..)
lugar.Esto debería imprimir
match
:fuente
grep
soporta\d
sin-P
?\w
y\b
, lo que aprendí de Perl, me confundí.\d
o PCRE son "no estándar". Son bastante estándar, solo un estándar diferente de las expresiones regulares originales y las expresiones regulares extendidas.\d
. Aunque tiene razón en que PCRE son bastante estándar, o en el menos bien definido. El problema molesto es que GNU grep (o glibc) soporta algunas PCRE-como los átomos, al menos\w
y\s
al interpretar ERE, y en ese contexto que mucho son no estándar. Mi fraseo bien puede provenir en parte de eso, y la mala recopilación que también\d
fue respaldada por GNU.(:...)
y\d
son operadores de expresión regular perl o PCRE (como en GNUgrep -P
).bash
solo admite expresiones regulares extendidas como engrep -E
excepto que para expresiones regulares pasadas literalmente en[[ text =~ regexp-here ]]
lugar de como resultado de una expansión sin comillas (como en[[ text =~ $var ]]
o[[ test =~ $(printf '%s\n' 'regexp-here') ]]
), se limita al conjunto de características de expresión regular extendida POSIX.Entonces, incluso en los sistemas donde
grep -E '\d'
funcionaría (los ERE de GNU ya han importado algunas extensiones de expresiones regulares perl, por\s
lo que las futuras versiones también podrían tenerlo\d
), tendría que usar:en
bash
para que funcione ([[ $text =~ \d ]]
no).Para un shell que admita PCRE, puede utilizar
zsh
en su lugar:ksh93 también admite su propia implementación de expresiones regulares similares a perl (no totalmente compatibles) como parte de su coincidencia de patrones. Allí, usarías:
(tenga
=
en cuenta el en lugar de=~
. Querrá usar variables temporales ya que es muy defectuoso cuando no lo hace)fuente
El sitio regex101.com usa PCRE (mira en la esquina superior izquierda) como predeterminado, y carece de soporte para la sintaxis de expresiones regulares "Extendida". Es "Expresiones regulares compatibles con Perl", que provienen (como es razonable esperar) de Perl.
PCRE es compatible con algunas herramientas (como
grep -P
) en algunas condiciones, pero el soporte de bash regex dentro del[[…]]
idioma es solo para expresiones regulares extendidas (likegrep -E
).En la expresión regular extendida, el
(?…)
paréntesis de no captura no existe y también falta el \ d. Necesita usar simple(…)
y[0-9]
:fuente