我试图替换包含以下文件的所有行:
/var/www/webxyz/html
至
/home/webxyz/public_html
字符串:webxyz是变量:like web1, web232
所以只有webxyz之前和之后的字符串应该被替换。试过这个没有解决方案:
sed -i 's/"var/www/web*/html"/"home/web*/public_html"/g'
我也希望这应该检查和替换文件(包括子目录和文件),* 运算符不起作用。
在正则表达式中,您需要转义围绕它们的分隔符,在您的情况下是/
. 但您也可以使用不同的分隔符,例如,
:
sed -i 's,"var/www/web*/html","home/web*/public_html",g'
但要使其按预期工作,您还需要删除并将(sed 不理解通配符)"
替换为如下内容:b*
sed -i 's,var/www/web\([^/]*\)/html,home/web\1/public_html,g'
这里\([^/]*\)
用于匹配web
除 a 之外的任何内容/
。然后\1
在替换部分中引用匹配的字符串。
以下是您的替换操作的外观(请参阅sed了解更多信息):
sed -i 's/var\/www\(\/.*\/\)html/home\1public_html/g'
请注意,这\(...\)
是一个分组,并指定了一个“匹配变量”,它在替换端显示为\1
. 另请注意.*
“匹配任何单个字符(点)零次或多次(星号)”。进一步注意,您的/
字符必须进行转义,以免它们被视为sed
控制结构的一部分。