0

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

/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'

我也希望这应该检查和替换文件(包括子目录和文件),* 运算符不起作用。

4

2 回答 2

3

在正则表达式中,您需要转义围绕它们的分隔符,在您的情况下是/. 但您也可以使用不同的分隔符,例如,

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在替换部分中引用匹配的字符串。

于 2013-08-10T15:14:53.390 回答
1

以下是您的替换操作的外观(请参阅sed了解更多信息):

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

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

于 2013-08-10T15:06:58.743 回答