【问题标题】:Sed using extended regexp and capture groupsSed 使用扩展的正则表达式和捕获组
【发布时间】: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 部分情况的尾随 .

标签: regex sed


【解决方案1】:

不需要转义大括号,因为([0-9]*) 是匹配符号组的有效语句。

$> echo "192.168.0.1" | sed -r 's/192\.168\.[0-9]*\.([0-9]*)/192\.168\.15\.\1/g'
192.168.15.1

【讨论】:

  • 请注意,如果您在文件中替换,使用 -ir 可能不起作用。如果是这种情况,您需要单独传递选项,如sed -i -r 's/.../.../ file'(或使用拼写版本:sed --in-place --regexp-extended 's/.../.../ file')。
猜你喜欢
  • 2021-01-30
  • 2016-11-11
  • 2016-12-30
  • 2012-03-06
  • 2015-08-06
  • 2019-10-16
  • 1970-01-01
  • 1970-01-01
  • 2020-03-14
相关资源
最近更新 更多