仅在文件尚不存在的情况下,才会将文件追加到文件中
我需要将以下行添加到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,使用grep
和echo
:
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