如何替换第二次出现的字符串' AllowOverride无'使用' AllowOverride All'使用sed

时间:2014-09-06 22:12:54

标签: regex sed

我想使用sed将文件AllowOverride None中第二次出现的字符串AllowOverride All替换为/etc/apache2/sites-available/default

以下是它的样子:

<VirtualHost *:80>
        ServerAdmin webmaster@localhost

        DocumentRoot /var/www
        <Directory />
                Options FollowSymLinks
                AllowOverride None
        </Directory>
        <Directory /var/www/>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride None
                Order allow,deny
                allow from all
        </Directory>

        ...

这就是我想要的样子:

<VirtualHost *:80>
        ServerAdmin webmaster@localhost

        DocumentRoot /var/www
        <Directory />
                Options FollowSymLinks
                AllowOverride None
        </Directory>
        <Directory /var/www/>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride All
                Order allow,deny
                allow from all
        </Directory>

        ...

我试过了:

sed -i 's/AllowOverride None/AllowOverride All/2' /etc/apache2/sites-available/default

但它没有改变任何东西。我接下来应该尝试什么?

2 个答案:

答案 0 :(得分:1)

这是使用sed

执行此操作的方法
sed -i ':a;N;$!ba;s/AllowOverride None/AllowOverride All/2' /etc/apache2/sites-available/default

否则,可以使用negative lookahead完成,如下所示,但sed不支持。

模式

AllowOverride None(?![\s\S]*AllowOverride None)

替换

AllowOverride All

Working demo

答案 1 :(得分:1)

您可以使用awk执行此操作:

awk '/AllowOverride/ && ++i==2 {sub(/None/,"All")}1' /etc/apache2/sites-available/default

当&#34; AllowOverride&#34;匹配,i递增。在第二场比赛中,替换&#34;无&#34;为&#34;所有&#34;。脚本末尾的1是用于打印每一行的常用简写(因为它的计算结果为true)。要覆盖原始文件,可以将输出重定向到临时文件:

awk '...' > tmp && mv tmp /etc/apache2/sites-available/default