【发布时间】:2012-10-19 04:47:58
【问题描述】:
我编写了以下 sed one 行来替换 IP 地址的第三部分。
sed 's/192\.168\.[0-9]*\.\([0-9]*\)/192.168.15.\1/g'
192.168.0.1
192.168.15.1
我想让它变得懒惰,因此它会使用扩展正则表达式的?? 将192.168.0 替换为192.168.15,但是当我提供“-r”选项时,我收到以下错误。
$ sed -r 's/192\.168\.[0-9]*\.\([0-9]*\)/192.168.15.\1/g'
sed: -e expression #1, char 44: invalid reference \1 on `s' command's RHS
您能解释一下这里发生了什么以及如何在使用捕获组时使表达式变得惰性?
注意:我可以使用许多不同的方法来实现示例,我的问题不是如何解决示例。我对将 sed 与扩展的正则表达式和捕获组一起使用很感兴趣。
【问题讨论】:
-
注:
sed -r 's/192\.168(\.[0-9]*){2}/192.168.15\1/g'达到相同的结果,反向引用\1返回两个(\.[0-9]*){2}中的第二个,并避免了正则表达式的重复。 -
这样更简洁,也有助于使表达式变得懒惰
sed -r 's/192\.168(\.??[0-9]*){2}/192.168.15\1/g',因为它处理 3 部分情况的尾随.。