sed在一行上匹配并更改另一行

时间:2018-09-27 19:12:59

标签: sed

我想浏览一个文件(在本例中为apache2.conf),搜索标记部分开头的行(),然后在该部分中更改另一行(AllowOverride None到AllowOverride All)。 / p>

我想更改的行可能不是本节开头的行,但我只想更改它的第一次出现。

以下是apache2.conf中的一个示例:

<Directory />
        Options FollowSymLinks
        AllowOverride None
        Require all denied
</Directory>

<Directory /usr/share>
        AllowOverride None
        Require all granted
</Directory>

<Directory /var/www/>             <= this is the begining of the section
        Options Indexes FollowSymLinks
        AllowOverride None        <= this is the line I want to change
        Require all granted
</Directory>

#<Directory /srv/>
#       Options Indexes FollowSymLinks
#       AllowOverride None
#       Require all granted
#</Directory>

在朋友的帮助下,我来到了这里

sed '/"<Directory \/var\/www\/>"/,$ {s/"AllowOverride None"/"AllowOverride All"/ }' apache2.conf

,但事实是它不起作用。 我期望AllowOverride None在经过sed后会变成AllowOverride All

有什么解决办法吗?我做错了什么?

1 个答案:

答案 0 :(得分:0)

您的sed命令非常接近。首先,您不应在其中添加双引号:

sed '/<Directory \/var\/www\/>/,$ {
        s/AllowOverride None/AllowOverride All/
}' apache2.conf

现在的问题是,它还会更改被注释掉的最后一节中的AllowOverride None,并且您“只想更改它的首次出现”。

只需在第一次出现“ AllowOverride None”时结束您的代码块即可:

sed '/<Directory \/var\/www\/>/,/AllowOverride None/ {
        s/AllowOverride None/AllowOverride All/
}' apache2.conf