簡體   English   中英

如何使用sed將字符串'AllowOverride None'的第二次出現替換為'AllowOverride All'

[英]How do I replace the second occurrence of string 'AllowOverride None' with 'AllowOverride All' using sed

我想用sed替換文件/etc/apache2/sites-available/default中的AllowOverride All字符串第二次出現的AllowOverride None字符串。

這是以前的樣子:

<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

但這並沒有改變任何東西。 接下來我應該嘗試什么?

這就是使用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

工作演示

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

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

當“ AllowOverride”匹配時, i遞增。 在第二場比賽中,將“無”替換為“全部”。 腳本末尾的1是用於打印每一行的常用速記(因為它的計算結果為true)。 要覆蓋原始文件,可以將輸出重定向到一個臨時文件:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM