使用bash脚本插入行

时间:2014-09-27 01:19:49

标签: bash shell sed

我正在编写一个bash脚本,在服务器上安装一些元素,然后遇到问题。

我正在安装nginx - 默认情况下,它不包括已启用网站和网站可用。

使用我的脚本,我会创建它们,并将它们包含在nginx.conf

我显然使用

制作目录
mkdir /etc/nginx/sites-available
mkdir /etc/nginx/sites-enabled

现在,我尝试了以下方法,但失败了:

sed '/include /etc/nginx/mime.types;/a include /etc/nginx/sites-enabled/*;' /etc/nginx/nginx.conf

并且:

sed 'include /etc/nginx/mime.types;/a include /etc/nginx/sites-enabled/*;' /etc/nginx/nginx.conf

OLDLINE = 'include /etc/nginx/mime.types;'
NEWLINE = 'include /etc/nginx/sites-enabled/*;'

sed 'OLDLINE/a NEWLINE' /etc/nginx/nginx.conf

OLDLINE = 'include /etc/nginx/mime.types;'
NEWLINE = 'include /etc/nginx/sites-enabled/*;'

sed '/OLDLINE/a NEWLINE' /etc/nginx/nginx.conf

并且:

OLDLINE = "include /etc/nginx/mime.types;"
NEWLINE = "include /etc/nginx/sites-enabled/*;"

sed 'OLDLINE/a NEWLINE' /etc/nginx/nginx.conf

我似乎无法弄明白。

2 个答案:

答案 0 :(得分:0)

sed命令的问题在于模式包含与命令分隔符冲突的/个字符。 如果你仍想用sed来解决这个问题,那么简单的解决办法就是逃避模式中的每一个斜杠:

sed '/include \/etc\/nginx\/mime.types;/a include \/etc\/nginx\/sites-enabled\/*;' /etc/nginx/nginx.conf

但是如果你对牙齿锯齿效果过敏,请尝试强制使用不同的命令分隔符:

sed '\@include /etc/nginx/mime.types;@a include /etc/nginx/sites-enabled/*;'  /etc/nginx/nginx.conf

此处我们使用@作为分隔符,因此/个字符不再需要转义。

请注意,您可以sed使用-i进行就地替换,但我相信这是GNU扩展。

答案 1 :(得分:0)

为了包含新行

include /etc/nginx/sites-enabled/*;
include /etc/nginx/sites-available/*;

行后:

include /etc/nginx/mime.types;

您可以使用{strong>编辑nginx.conf inline 的sed表达式(并创建原始备份),方法是搜索现有行include /etc/nginx/mime.types;,然后替换换行符以及您想要的添加内容:

sed -i.bak '/include \/etc\/nginx\/mime.types;/s|$|\ninclude /etc/nginx/sites-enabled/*;\ninclude /etc/nginx/sites-available/*;|' nginx.conf

这会创建nginx.conf.bak来保存原始配置文件并修改nginx.conf以包含:

include /etc/nginx/mime.types;
include /etc/nginx/sites-enabled/*;
include /etc/nginx/sites-available/*;