使用sed替换字符串(fstab)中文本的确切部分

时间:2012-12-10 15:33:33

标签: regex sed

我正在两台服务器之间迁移一些数据。数据保存在每台服务器上的相同文件夹结构中。

移动数据后,我想更新所有受影响的Linux机器上的fstab文件。我有一个bash脚本,用于rsyncs服务器之间的数据,然后登录到列表中的每台机器,并使用sed使用新的IP地址更新fstab。

sed "s/\(172.16.0.30\)\(.*\)\(${share}\)\(.*\)/172.16.0.35\2\3\4/"

这在过去一直很好用,但这次我正在迁移一个名字与其他几个名字非常相似的文件夹,让我们说$ share是'home':

home
home-old
home-ancient

我遇到的问题是这个正则表达式正在使用$ share中包含的文本获取所有共享,而不仅仅是我想要的那个。

有没有办法调整正则表达式,以便它只会替换我想要的单行IP?我看过/ b变量,但似乎无法让它工作,不幸的是,正则表达式通常会让我感到困惑!

1 个答案:

答案 0 :(得分:1)

\b是GNU扩展,在这种情况下不起作用,因为它匹配单词边界,空格和-都在非单词组中。它将匹配所有这些。一个简单的选择是匹配$share之后的空格(或行尾)字符,如:

sed "s/\(172.16.0.30\)\(.*\)\(${share}\)\( \(.*\)\|$\)/172.16.0.35\2\3\4/"