我需要将以下行添加到配置文件的末尾:
include "/configs/projectname.conf"
将内容保存到名为lighttpd.conf
的文件中。
我正在研究如何使用sed
来做到这一点,但是我无法弄清楚如何操作。
如果该行不存在,我应该如何插入它?
#text to add
的行仍将在查找要添加的确切文本时匹配text to add
。grep -qxF 'include "/configs/projectname.conf"' foo.bar || echo 'include "/configs/projectname.conf"' >> foo.bar
#!/bin/bash
#Find and Replace config values
find_and_replace_config () {
file=$1
var=$2
new_value=$3
awk -v var="$var" -v new_val="$new_value" 'BEGIN{FS=OFS="="}match($1, "^\\s*" var "\\s*") {$2=" " new_val}1' "$file" > output.tmp && sudo mv output.tmp $file
}
find_and_replace_config /etc/php5/apache2/php.ini max_execution_time 60
我通过设置变量来减少重复,详细说明了kev的grep/sed解决方案。
在第一行设置变量(提示:$_option
应匹配到值之前的所有内容[包括任何分隔符如=或:])。
_file="/etc/ssmtp/ssmtp.conf" _option="mailhub=" _value="my.domain.tld" \ sh -c '\ grep -q "^$_option" "$_file" \ && sed -i "s/^$_option.*/$_option$_value/" "$_file" \ || echo "$_option$_value" >> "$_file"\ '
请注意,sh -c '...'
只是扩大变量范围的效果,无需使用export
。(参见在bash中设置环境变量以便管道中的第二个命令不起作用)
import os,sys
LINE = 'include '+ <insert_line_STRING>
FILE = <insert_file_path_STRING>
os.system('grep -qxF $"'+LINE+'" '+FILE+' || echo $"'+LINE+'" >> '+FILE)
美元符号和双引号让我感到很困惑,但这个方法行得通。谢谢大家。
我需要编辑一个带有受限写入权限的文件,因此需要使用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
crudini
可能是一个不错的选择(但还不能用于lighthttpd)。 - rubo77