使用https://regex101.com/我构建了一个正则表达式来返回字符串中第一次出现的 IP 地址。
正则表达式:
(?:\d{1,3}\.)+(?:\d{1,3})
RegExp 包括分隔符:
/(?:\d{1,3}\.)+(?:\d{1,3})/
使用以下测试字符串:
eu-west 140.243.64.99
它返回一个完整的匹配:
140.243.64.99
无论我尝试使用锚点等,以下 bash 脚本都不适用于生成的正则表达式。
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
是说“任何数字”的非标准方式。我认为它来自 Perl,并且许多其他语言和实用程序也支持 Perl 兼容的 RE(PCRE)。(例如,Debian 中的 GNU grep 2.27\w
即使在正常模式下也支持类似的单词字符。)但是, Bash 不支持
\d
,因此您需要明确使用[0-9]
or[[:digit:]]
。与非捕获组相同(?:..)
,仅使用(..)
。这应该打印
match
:(:...)
并且\d
是 perl 或 PCRE 正则表达式运算符(如在 GNU 中grep -P
)。bash
仅支持扩展正则表达式,grep -E
除了对于按字面传递的正则表达式,[[ text =~ regexp-here ]]
而不是作为未引用扩展的结果(如[[ text =~ $var ]]
or[[ test =~ $(printf '%s\n' 'regexp-here') ]]
),它仅限于 POSIX 扩展正则表达式功能集。因此,即使在
grep -E '\d'
可以工作的系统上(GNU ERE 已经从 perl 正则表达式中导入了一些扩展,\s
未来的版本也可能如此\d
),您也必须使用:bash
让它工作(不会[[ $text =~ \d ]]
)。对于支持 PCRE 的 shell,您可能需要
zsh
改用:ksh93 还支持其自己的类似 perl 的正则表达式的实现(不完全兼容)作为其模式匹配的一部分。在那里,你会使用:
(注意,
=
而不是=~
。你会想要使用临时变量,因为当你不这样做的时候它是非常错误的)站点regex101.com使用 PCRE(查看左上角)作为默认值,并且它缺乏对“扩展”正则表达式语法的支持。那就是“Perl 兼容的正则表达式”,它来自 Perl(这是合理的预期)。
在某些情况下,某些工具(如
grep -P
)支持 PCRE,但成语内的 bash 正则表达式支持[[…]]
仅适用于扩展正则表达式(如grep -E
)。在扩展的正则表达式中,不存在非捕获
(?…)
括号,并且 \d 也丢失了。您需要使用简单的(…)
and[0-9]
: