2015-09-27 84 views
2

我想在以字DocumentRoot開頭的特定行之後插入一段文本。如何使用bash在特定行之後插入文本?

這是原文(文件名爲li1023-68.members.linode.com):

<VirtualHost *:80> 
    ServerName li1023-68.members.linode.com 
    DocumentRoot /srv/www/li1023-68.members.linode.com/public_html/ 
    ErrorLog /srv/www/li1023-68.members.linode.com/logs/error.log 
    CustomLog /srv/www/li1023-68.members.linode.com/logs/access.log combined 
</VirtualHost> 

這就是我想要達到的目標:

<VirtualHost *:80> 
    ServerName li1023-68.members.linode.com 
    DocumentRoot /srv/www/li1023-68.members.linode.com/public_html/ 
    <Directory /srv/www/$path/public_html> 
     Options Indexes FollowSymLinks MultiViews 
     AllowOverride All 
     Order allow,deny 
     allow from all 
    </Directory> 
    ErrorLog /srv/www/li1023-68.members.linode.com/logs/error.log 
    CustomLog /srv/www/li1023-68.members.linode.com/logs/access.log combined 
</VirtualHost> 

我試着用下面的代碼這樣做,它不會工作。 $path認爲,應該修改的文本的名稱(即li1023-68.members.linode.com):

value="<Directory /srv/www/$path/public_html> 
Options Indexes FollowSymLinks MultiViews 
AllowOverride All 
Order allow,deny 
allow from all 
</Directory>" 

sed '/DocumentRoot.*$/a $value' /etc/apache2/sites-available/$path 
while read line 
do 
     echo $line 
     echo $line | grep -q "DocumentRoot" 
     [ $? -eq 0 ] && echo "$value" 
done < $path 

我缺少什麼?

回答

2

單引號防止擴大$value殼,你需要用sed的s(替補)命令:

sed -i "s!DocumentRoot.*!&\n$value!" /etc/apache2/sites-available/$path 

-i參數告訴sed就地置換做;即在不將輸出發送到標準輸出的情況下更改文件,並且在搜索字符串的末尾不需要$

但是sed會在$value中看到第一個換行符,並假定它會終止命令,這不是您想要的。與\n這樣的替換$value新行:

value="<Directory /srv/www/$path/public_html>\nOptions Indexes FollowSymLinks MultiViews\n..." 

[編輯:請注意,還在於它的習慣來分隔模式和替代用斜槓,但隨後SED將承擔$value是分隔符的斜線!所以我們可以使用感嘆號(或任何其他未使用的字符)。]

然後,你根本不需要循環。

如果使用循環替代(你不需要兩個),切記要指定整個文件名:

done < /etc/apache2/sites-available/$path 
+0

感謝亞當的答案,但我得到一個錯誤「的sed:-e表達式#1,字符33:未知選項's'「 – Tom

+0

哈!我認爲sed在目錄名稱中看到了斜線,並認爲它們是命令的一部分。我會更新我的答案;抱歉。 –

+0

也循環不起作用:/ – Tom

相關問題