如何使用bash在特定行后插入文本?

如何使用bash在特定行后插入文本?,bash,sed,Bash,Sed,我想在以单词DocumentRoot开头的特定行后插入一块文本 这是原始文本(文件名为li1023-68.members.linode.com): 我缺少什么?单引号阻止shell扩展$value,您需要使用sed的s(替换)命令: -i参数告诉sed进行就地替换;也就是说,在不将输出发送到stdout的情况下更改文件,并且不需要在搜索字符串的末尾添加$ 但是sed将在$value中看到第一个换行符,并假设它终止了命令,这不是您想要的。将$value中的换行符替换为\n,如下所示: value=

我想在以单词
DocumentRoot
开头的特定行后插入一块文本

这是原始文本(文件名为
li1023-68.members.linode.com
):


我缺少什么?

单引号阻止shell扩展
$value
,您需要使用sed的
s
(替换)命令:

-i
参数告诉sed进行就地替换;也就是说,在不将输出发送到stdout的情况下更改文件,并且不需要在搜索字符串的末尾添加
$

但是sed将在
$value
中看到第一个换行符,并假设它终止了命令,这不是您想要的。将
$value
中的换行符替换为
\n
,如下所示:

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

谢谢adam的回答,但是我得到了一个错误“sed:-e表达式#1,char 33:'s'的未知选项”哈!我认为sed看到了目录名中的斜杠,并认为它们是命令的一部分。我会更新我的答案;对不起,这个循环似乎对我有用。你看到了什么错误?成功了!像“\n”这样的缩进/制表符的等价物是什么?\t是制表符。在命令提示符下查看或使用
manbash
<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>
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
sed -i "s!DocumentRoot.*!&\n$value!" /etc/apache2/sites-available/$path
value="<Directory /srv/www/$path/public_html>\nOptions Indexes FollowSymLinks MultiViews\n..."
done < /etc/apache2/sites-available/$path