仅在文件尚不存在的情况下,才会将文件追加到文件中

我需要将以下行添加到configuration文件的末尾:

include "/configs/projectname.conf" 

到一个名为lighttpd.conf的文件

我正在调查使用sed来做到这一点,但我不能解决如何。

如果行不存在,我将如何只插入它?

只要保持简单:)

grep + echo应该足够了:

 grep -q -F 'include "/configs/projectname.conf"' foo.bar || echo 'include "/configs/projectname.conf"' >> foo.bar 

编辑:合并@Cerinbuild议

对于“编辑”改变我的答案:如果你有一个替代解决scheme给你自己的答案! 编辑是为了澄清,格式化,更好的英语等! 别改变别人给出的答案! (谢谢)

这将是一个干净,可读和可重用的解决scheme,使用grepecho

 LINE='include "/configs/projectname.conf"' FILE=lighttpd.conf grep -qF "$LINE" "$FILE" || echo "$LINE" >> "$FILE" 

这是一个sed版本:

 sed -e '\|include "/configs/projectname.conf"|h; ${x;s/incl//;{g;t};a\' -e 'include "/configs/projectname.conf"' -e '}' file 

如果你的string是在一个variables中:

 string='include "/configs/projectname.conf"' sed -e "\|$string|h; \${x;s|$string||;{g;t};a\\" -e "$string" -e "}" file 

使用awk

 awk 'FNR==NR && /configs.*projectname\.conf/{f=1;next}f==0;END{ if(!f) { print "your line"}} ' file file 

如果写入受保护的文件,@drAlberT和@ rubo77的答案可能不适用于你,因为不能sudo >> 。 然后, 类似的简单解决scheme就是使用tee --append

 LINE='include "/configs/projectname.conf"' FILE=lighttpd.conf grep -qF "$LINE" "$FILE" || echo "$LINE" | sudo tee --append "$FILE" 

另一个sed解决scheme是总是把它追加到最后一行并删除一个现有的。

 sed -e '$a\' -e '<your-entry>' -e "/<your-entry-properly-escaped>/d" 

“正确地逃脱”意味着把一个正则expression式匹配你的条目,也就是逃避真正的所有正则expression式控制,也就是把^ $ / *?+()的反斜杠。

这可能会失败在文件的最后一行或者如果没有纠结的换行符,我不确定,但可以通过一些漂亮的分支来处理…

我需要编辑具有受限写入权限的文件,所以需要sudo 。 从ghostdog74的答案和使用临时文件工作:

 awk 'FNR==NR && /configs.*projectname\.conf/{f=1;next}f==0;END{ if(!f) { print "your line"}} ' file > /tmp/file sudo mv /tmp/file file