SED添加正则表达式捕获组

7

有人能帮忙吗?我正在尝试使用正则表达式和捕获组进行sed追加,但它并没有完全起作用:

echo "#baseurl=http://mirror.centos.org/centos/$releasever/contrib/$basearch/" | sed -re '/#baseurl=http:\/\/mirror.centos.org(.*)/a baseurl=https:\/\/10.10.10.10\ \1'
 #baseurl=http://mirror.centos.org/centos//contrib//
 baseurl=https://10.10.10.10 1

现在它只是提供字面值1而不是捕获组。

应该给出:

 #baseurl=http://mirror.centos.org/centos//contrib//
 baseurl=https://10.10.10.10/centos//contrib//

我也尝试过反斜杠括号,但它不起作用。请协助解决,因为这让我很头痛...
1个回答

8
只有在使用seds(替换)命令时,才能捕获反向引用。以下命令可以正常工作:
s="#baseurl=http://mirror.centos.org/centos/$releasever/contrib/$basearch/"    
sed -r 's~#baseurl=http://mirror\.centos\.org(.*)~&\nbaseurl=https://10.10.10.10\1~' <<< "$s"

#baseurl=http://mirror.centos.org/centos//contrib//
baseurl=https://10.10.10.10/centos//contrib//

1
做得非常好(我在之前就点赞了)。为什么反向引用只能在替换模式下使用?我找不到相关的参考资料。 - fedorqui
1
我认为除了替换模式,只有/search/允许使用正则表达式和分组,因为在那里没有替换,我们无法使用反向引用。 - anubhava
1
谢谢,我使用了s命令,并使用了两个捕获组(...(.*)),然后只打印了\1\nxyz\2,这与你的方法差不多!无论如何还是谢谢! - Jahed Uddin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接