Sed使用扩展的正则表达式和捕获组

Chr*_*our 8 regex sed

我写了下面的sed one liner来代替IP地址的第3部分.

sed 's/192\.168\.[0-9]*\.\([0-9]*\)/192.168.15.\1/g'

192.168.0.1
192.168.15.1
Run Code Online (Sandbox Code Playgroud)

我希望把它懒惰所以它会取代192.168.0192.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
Run Code Online (Sandbox Code Playgroud)

你能解释一下这里发生了什么以及如何在使用捕获组时使表达变得懒惰吗?

注意:我可以使用许多不同的方法来实现这个例子,我的问题不是如何解决这个例子.我很有兴趣使用带有扩展正则表达式和捕获组的sed.

ДМИ*_*КОВ 8

没有必要转义大括号,因为([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
Run Code Online (Sandbox Code Playgroud)

  • 请注意,如果您在文件中进行替换,则使用 -ir 可能不起作用。如果是这种情况,您需要单独传递选项,如`sed -i -r 's/.../.../ file'`(或使用拼写版本:`sed --in-place --regexp-extended 's/.../.../ file'`)。 (3认同)