sed替换而不触及字符串

时间:2013-08-10 14:57:07

标签: variables replace sed

我试图替换包含以下内容的文件中的所有行:

的/ var / WWW / webxyz / HTML

/家庭/ webxyz /的public_html

字符串: webxyz 是可变的:如web1,web232

因此,只应替换 webxyz 之前和之后的字符串。 没有解决方案就试过了:

sed -i 's/"var/www/web*/html"/"home/web*/public_html"/g'

另外我想要这应该检查和替换文件(包含子目录和文件), *运算符不起作用。

2 个答案:

答案 0 :(得分:3)

在正则表达式中,您需要转义围绕它们的分隔符,例如/。但您也可以使用其他分隔符,例如,

sed -i 's,"var/www/web*/html","home/web*/public_html",g'

但为了让它按预期工作,您还需要删除"并将b*(sed不理解通配符通配符)替换为以下内容:

sed -i 's,var/www/web\([^/]*\)/html,home/web\1/public_html,g'

此处\([^/]*\)用于匹配web之后的任何内容,但/除外。然后,替换部分中的\1引用匹配的字符串。

答案 1 :(得分:1)

以下是您的替换操作应该是什么样的(有关详细信息,请参阅sed):

sed -i 's/var\/www\(\/.*\/\)html/home\1public_html/g'

请注意,\(...\)是一个分组,并指定一个“匹配变量”,它在替换方显示为\1。另请注意.*表示“匹配任何单个字符(点)零次或多次(星级)”。请进一步注意,必须转义/个字符,以免将它们视为sed控件结构的一部分。