我需要在配置文件的末尾添加以下一行:
include "/configs/projectname.conf"
到一个名为lighttpd.conf的文件
我正在研究使用sed来做到这一点,但我不知道如何。
我怎么能只插入它,如果行已经不存在?
我需要在配置文件的末尾添加以下一行:
include "/configs/projectname.conf"
到一个名为lighttpd.conf的文件
我正在研究使用sed来做到这一点,但我不知道如何。
我怎么能只插入它,如果行已经不存在?
当前回答
另一个sed解决方案是始终将它附加到最后一行,并删除一个预先存在的。
sed -e '$a\' -e '<your-entry>' -e "/<your-entry-properly-escaped>/d"
“适当转义”意味着放入一个匹配你的条目的正则表达式,即从你的实际条目中转义所有的正则表达式控件,即在^$/*?+()前面放一个反斜杠。
这可能会在文件的最后一行失败,或者如果没有悬空换行符,我不确定,但这可以通过一些漂亮的分支来处理…
其他回答
sed -i '1 h
1 !H
$ {
x
s/^option.*/option=value/g
t
s/$/\
option=value/
}' /etc/fdm_monitor.conf
加载缓冲区中的所有文件,在结束时,更改所有发生的情况,如果没有发生变化,则添加到结束
这将是一个干净、易读和可重用的解决方案,使用grep和echo仅在文件不存在时才向文件添加一行:
LINE='include "/configs/projectname.conf"'
FILE='lighttpd.conf'
grep -qF -- "$LINE" "$FILE" || echo "$LINE" >> "$FILE"
如果需要匹配整行,请使用grep -xqF
添加-s来忽略文件不存在时的错误,用这一行创建一个新文件。
Try:
LINE='include "/configs/projectname.conf"'
sed -n "\|$LINE|q;\$a $LINE" lighttpd.conf >> lighttpd.conf
使用管道作为分隔符,如果找到$LINE则退出。否则,在结尾附加$LINE。
因为我们只在sed命令中读取文件,所以我认为我们一般不存在clobber问题(这取决于您的shell设置)。
使用awk
awk 'FNR==NR && /configs.*projectname\.conf/{f=1;next}f==0;END{ if(!f) { print "your line"}} ' file file
另一个sed解决方案是始终将它附加到最后一行,并删除一个预先存在的。
sed -e '$a\' -e '<your-entry>' -e "/<your-entry-properly-escaped>/d"
“适当转义”意味着放入一个匹配你的条目的正则表达式,即从你的实际条目中转义所有的正则表达式控件,即在^$/*?+()前面放一个反斜杠。
这可能会在文件的最后一行失败,或者如果没有悬空换行符,我不确定,但这可以通过一些漂亮的分支来处理…