我试图替换包含以下内容的文件中的所有行:
的/ var / WWW / webxyz / HTML
到
/家庭/ webxyz /的public_html
字符串: webxyz 是可变的:如web1,web232
因此,只应替换 webxyz 之前和之后的字符串。 没有解决方案就试过了:
sed -i 's/"var/www/web*/html"/"home/web*/public_html"/g'
另外我想要这应该检查和替换文件(包含子目录和文件), *运算符不起作用。
答案 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
控件结构的一部分。