我想使用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
但它没有改变任何东西。我接下来应该尝试什么?
答案 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
答案 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