作为我的 Bash 服务器安装脚本的一部分,我正在尝试锁定默认的 apache www 网站。
我想转换这个:
<Directory /var/www>
Options Indexes FollowSymLinks
对此:
<Directory /var/www>
Options -Indexes -FollowSymLinks -ExecCGI
由于Options Indexes FollowSymLinks
文件中多次提及,我需要搜索和替换以包含上一行。
我尝试了以下sed
命令,使用反斜杠来转义斜杠,但它并没有替换任何东西:
cat /etc/apache2/apache2.conf | sed 's/[<Directory \/var\/www\/>]\n Options Indexes FollowSymLinks/[<Directory \/var\/www\/>]\n Options -Indexes -FollowSymLinks -ExecCGI/;P;D'
我尝试过将内容放在引号和方括号内。该命令似乎也不喜欢制表符。
任何想法,将不胜感激。
答案1
sed
默认情况下,对每一行分别进行操作,因此您不能使用\n
。如果您想对多行进行操作,您可以使用标志-z
,该标志用 NUL 字符分隔行并允许使用\n
。
另外,您不必通过管道将cat
的输出传输到sed
,因为它sed
可以自行读取文件。
/
此外,在命令中使用它作为分隔符并不是强制性的sed
,因为sed
其他分隔符也可以接受。在您的案例中使用不同的分隔符的好处是不必/
使用反斜杠 ( \
) 进行转义。
因此您需要运行的命令是:
sed -z 's|<Directory /var/www>\n\tOptions Indexes FollowSymLinks|<Directory /var/www>\n\tOptions -Indexes -FollowSymLinks -ExecCGI|' /etc/apache2/apache2.conf
请注意,在上面的命令中,我使用了\t
制表符。但是,并非所有版本的 都sed
接受\t
制表符。如果上述命令对您不起作用,您可以通过按+然后点击 ,\t
在终端中用文字制表符替换,或者使用此 Stack Overflow 问题中的另一种方法:CtrlVTab为什么 sed 不将 \t 识别为制表符?
答案2
你似乎需要搜索包括前一行,但不包括替换。因此,您可以搜索模式的第一行,然后使用命令n
加载n然后,您可以按照通常的方式处理它,或者使用s替代
sed '\:<Directory /var/www>:{
n
s/Options Indexes FollowSymLinks/Options -Indexes -FollowSymLinks -ExecCGI/
}' file
或C挂整条线
sed '\:<Directory /var/www>:{
n
c\ Options -Indexes -FollowSymLinks -ExecCGI
}' file