使用 sed 替换 apache2.conf 文件中的多行字符串

使用 sed 替换 apache2.conf 文件中的多行字符串

作为我的 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

相关内容