簡體   English   中英

特定模式后替換sed

[英]Sed replace after specific pattern

給定這種模式:

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

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

<Directory /var/www/>
        Options Indexes FollowSymLinks
        AllowOverride None //change this one
        Require all granted
</Directory>

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

運行$ sed -e 's/AllowOverride None/AllowOverride All/i' file將更改AllowOverride所有實例

如何將<Directory /var/www/>AllowOverride None更改為AllowOverride All

通過sed

$ sed  '/<Directory \/var\/www\/>/,/<\/Directory>/{s~AllowOverride None~AllowOverride All~i}' file
<Directory />
        Options FollowSymLinks
        AllowOverride None
        Require all denied
</Directory>

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

<Directory /var/www/>
        Options Indexes FollowSymLinks
        AllowOverride All //change this one
        Require all granted
</Directory>

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

/<Directory \\/var\\/www\\/>/,/<\\/Directory>/用於選擇那些在范圍內的行。 {s~AllowOverride None~AllowOverride All~i}僅在那些匹配的行上進行替換。

您可以將sed的地址范圍指定為

$ $ sed -e '\#<Directory /var/www/>#, \#</Directory># s/AllowOverride None/AllowOverride All/i' input

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

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

<Directory /var/www/>
        Options Indexes FollowSymLinks
        AllowOverride All //change this one
        Require all granted
</Directory>

<Directory /srv/>
       Options Indexes FollowSymLinks
       AllowOverride None
       Require all granted
</Directory>
  • #<Directory /var/www/>#, \\#</Directory>#確保僅對開始模式Directory /var/www/>和結束模式</Directory>

您可以將awkRS=一起使用:

awk -v RS= -v ORS='\n\n' '/<Directory \/var\/www\/>/ {
            sub(/AllowOverride None/, "AllowOverride All")} 1' file
<Directory />
        Options FollowSymLinks
        AllowOverride None
        Require all denied
</Directory>

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

<Directory /var/www/>
        Options Indexes FollowSymLinks
        AllowOverride All //change this one
        Require all granted
</Directory>

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

使用RS=會將記錄分隔符設置為空字符串,從而為我們提供每個記錄中的每個<Directory>...</Directory>塊。 然后只需將記錄與<Directory /var/www/>匹配,並使用sub輕松替換即可。

sed '/<Directory \/var\/www\/>/,/^<\Directory>.$/s/AllowOverride None/AllowOverride All/g'

跨多行查找模式

<Directory \/var\/www\/>/,/^<\Directory>.$

查找以<Directory /var/www/>並以僅</Directory>結尾的每一行

之后,將每個模式組中的AllowOverride All替換為AllowOverride None

產量

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

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

<Directory /var/www/>
        Options Indexes FollowSymLinks
        AllowOverride All //change this one
        Require all granted
</Directory>

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

暫無
暫無

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

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