如果文件中不存在该行,则将一行内容追加到文件中。

253

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

include "/configs/projectname.conf"

将内容保存到名为lighttpd.conf的文件中。

我正在研究如何使用sed来做到这一点,但是我无法弄清楚如何操作。

如果该行不存在,我应该如何插入它?


如果您想要编辑一个ini文件,工具crudini可能是一个不错的选择(但还不能用于lighthttpd)。 - rubo77
25个回答

1
使用grep的答案是错误的。您需要添加-x选项来匹配整行,否则类似于#text to add的行仍将在查找要添加的确切文本时匹配text to add
因此,正确的解决方案类似于:
grep -qxF 'include "/configs/projectname.conf"' foo.bar || echo 'include "/configs/projectname.conf"' >> foo.bar

0
您可以使用此函数查找和搜索配置更改:
#!/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

0

我通过设置变量来减少重复,详细说明了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中设置环境变量以便管道中的第二个命令不起作用


0
如果您想在Linux终端中使用Python脚本运行此命令...
import os,sys
LINE = 'include '+ <insert_line_STRING>
FILE = <insert_file_path_STRING>                                
os.system('grep -qxF $"'+LINE+'" '+FILE+' || echo $"'+LINE+'" >> '+FILE)

美元符号和双引号让我感到很困惑,但这个方法行得通。谢谢大家。


-2

我需要编辑一个带有受限写入权限的文件,因此需要使用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

这看起来不正确,当配置行丢失时,它将丢失文件中的其他行。 - tripleee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接