我需要将以下行添加到配置文件的末尾:
include "/configs/projectname.conf"
将内容保存到名为lighttpd.conf
的文件中。
我正在研究如何使用sed
来做到这一点,但是我无法弄清楚如何操作。
如果该行不存在,我应该如何插入它?
这里有一个 awk
实现:
/^option *=/ {
print "option=value"; # print this instead of the original line
done=1; # set a flag, that the line was found
next # all done for this line
}
{print} # all other lines -> print them
END { # end of file
if(done != 1) # haven't found /option=/ -> add it at the end of output
print "option=value"
}
使用以下方式运行:
awk -f update.awk < /etc/fdm_monitor.conf > /etc/fdm_monitor.conf.tmp && \
mv /etc/fdm_monitor.conf.tmp /etc/fdm_monitor.conf
awk -f update.awk < /etc/fdm_monitor.conf | sponge /etc/fdm_monitor.conf
编辑: 简述:
awk '/^option *=/ {print "option=value";d=1;next}{print}END{if(d!=1)print "option=value"}' /etc/fdm_monitor.conf | sponge /etc/fdm_monitor.conf
使用awk
awk 'FNR==NR && /configs.*projectname\.conf/{f=1;next}f==0;END{ if(!f) { print "your line"}} ' file file
NR==FNR
在第一次遍历时为真,但在第二次遍历时不为真。这是一个常见的Awk习语。 - tripleee sed -i 's/^option.*/option=value/g' /etc/fdm_monitor.conf
grep -q "option=value" /etc/fdm_monitor.conf || echo "option=value" >> /etc/fdm_monitor.conf
我假设它已经存在并将其删除。
使用sed我添加了我想要的字符串。
sed -i '/KUBECONFIG=/d' ~/.bashrc
echo 'export KUBECONFIG=/etc/rancher/rke2/rke2.yaml' >> ~/.bashrc
这里有一个awk单行命令:
awk -v s="option=value" '/^option/{f=1;$0=s}7;END{if(!f)print s}' file
这不会对文件进行原地更改,但你可以:
awk '...' file > tmpfile && mv tmpfile file
使用 sed
,你可以这样说:
sed -e '/option=/{s/.*/option=value/;:a;n;:ba;q}' -e 'aoption=value' filename
如果参数已经存在,它将被替换,否则将添加到文件底部。
如果您想原地编辑文件,请使用-i
选项:
sed -i -e '/option=/{s/.*/option=value/;:a;n;:ba;q}' -e 'aoption=value' filename
sed -i '1 h
1 !H
$ {
x
s/^option.*/option=value/g
t
s/$/\
option=value/
}' /etc/fdm_monitor.conf
将所有文件加载到缓冲区中,在结尾处更改所有出现的内容,如果没有更改发生,则添加到结尾
仅使用sed
,我建议采用以下解决方案:
sed -i \
-e 's#^include "/configs/projectname.conf"#include "/configs/projectname.conf"#' \
-e t \
-e '$ainclude "/configs/projectname.conf"' lighttpd.conf
s
将行 include "/configs/projectname.conf
用自身替换(在此使用#
作为分隔符)
t
如果替换成功,则跳过其余命令
$a
否则跳转到最后一行并在其后追加 include "/configs/projectname.conf
grep -qxF "port=9033" $light.conf
if [ $? -ne 0 ]; then
sed -i "$ a port=9033" $light.conf
else
echo "port=9033 already added"
fi
grep -qxF "port=9033" $lightconf || sed -i "$ a port=9033" $lightconf
grep -qxF "port=9033" light.conf
if [ $? -ne 0 ]; then
sudo -u $user_name echo "port=9033" >> light.conf
else
echo "already there"
fi
尝试:
LINE='include "/configs/projectname.conf"'
sed -n "\|$LINE|q;\$a $LINE" lighttpd.conf >> lighttpd.conf
使用管道作为分隔符,如果找到$LINE
则退出。否则,在末尾追加$LINE
。
由于我们只在sed命令中读取文件,我认为通常情况下不会有覆盖问题(这取决于您的shell设置)。
crudini
可能是一个不错的选择(但还不能用于lighthttpd)。 - rubo77