作为我的 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'
我试过把东西放在引号和方括号里。该命令似乎也不喜欢这些选项卡。
任何想法,将不胜感激。
sed
默认情况下分别对每一行进行操作,因此您不能使用\n
. 如果要对多行进行操作,可以使用-z
标志,该标志以 NUL 字符分隔行并允许使用\n
.此外,您不必将
cat
的输出通过管道传输到sed
,因为sed
可以自行读取文件。/
此外,在您的sed
命令中使用分隔符不是强制性的,因为也sed
接受其他分隔符。在您的情况下使用不同的分隔符的好处是不必每次都/
使用反斜杠 (\
) 进行转义。所以你需要运行的命令是:
请注意,在上面的命令中,我用作
\t
制表符。但是,并非所有版本都sed
接受\t
制表符。如果上述命令对您不起作用,您可以\t
通过按Ctrl+V然后点击来替换终端中的文字选项卡Tab,或者使用此 Stack Overflow 问题中的另一种方法:为什么 sed 不将 \t 识别为选项卡?您似乎需要搜索以包括前一行,而不是替换。因此,您可以搜索模式的第一行,然后使用
n
命令加载下一行,然后您可以使用s ubstitute以通常的方式处理它或通过c挂起整条线