![egrep 正则表达式:字符类中具有 [ 和 ] 或点不匹配](https://linux22.com/image/169845/egrep%20%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%EF%BC%9A%E5%AD%97%E7%AC%A6%E7%B1%BB%E4%B8%AD%E5%85%B7%E6%9C%89%20%5B%20%E5%92%8C%20%5D%20%E6%88%96%E7%82%B9%E4%B8%8D%E5%8C%B9%E9%85%8D.png)
我正在尝试将 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
。有一个d
在671d
.请记住,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
如果您还需要处理大写十六进制数字,请在括号内使用。