egrep 正则表达式:字符类中具有 [ 和 ] 或点不匹配

egrep 正则表达式:字符类中具有 [ 和 ] 或点不匹配

我正在尝试将 IPv6 地址与方括号匹配,但令人惊讶的是我陷入了困境......

作品:

echo 'files ([2001:450:671d:200::121]:59464).' | egrep 'files \(.+\)\.$'

不匹配(但我认为字符类中的点是有效的):

echo 'files ([2001:450:671d:200::121]:59464).' | egrep 'files \([.]+\)\.$'

任何其他尝试,例如

echo 'files ([2001:450:671d:200::121]:59464).' | egrep 'files \([][0-9:]+\)\.$'
echo 'files ([2001:450:671d:200::121]:59464).' | egrep 'files \([[]0-9:]+\)\.$'
echo 'files ([2001:450:671d:200::121]:59464).' | egrep 'files \([]0-9:[]+\)\.$'
echo 'files ([2001:450:671d:200::121]:59464).' | egrep 'files \([\[\]0-9:]+\)\.$'

也不起作用...

这里到底出了什么问题?

答案1

第一个 ,\([.]+\)将匹配文字括号内的文字点,例如(...)等。其他的与上面的十六进制数字不匹配9,即abcdef。有一个d671d.请记住,IPv6 地址是十六进制的。

您需要添加这些,所以:

echo 'files ([2001:450:671d:200::121]:59464).' | egrep 'files \([][0-9a-f:]+\)\.$'

或者更严格地说:

echo 'files ([2001:450:671d:200::121]:59464).' | egrep 'files \(\[[0-9a-f:]+\]:[0-9]+\)\.$'

或者a-fA-F如果您还需要处理大写十六进制数字,请在括号内使用。

相关内容