我正在使用sed
替换conf中的行:
sed -i.bak 's/^option.*/option newparam/' somefile.conf
如果某个文件中不存在我的选项行,如何告诉sed
插入它或返回false?
最后我最终得到了:
sed -i.bak "s/^#$STR.*\|^# $STR.*\|^$STR.*/$OPT/" $FILE && grep -q "^$OPT" $FILE || echo "$OPT" >> $FILE
答案 0 :(得分:4)
删除以option
开头的行,将a
)option newparam
追加到文件的最后一行($
)
sed -i.bak '/^option/d; $ a\option newparam' somefile.conf
注意:既然您说如果option
行不存在则要插入新行,我认为新行所在的位置并不重要。
答案 1 :(得分:2)
如果使用双管道运算符||
将行附加到文件的末尾,请使用grep检查该行是否先存在。如果第一个命令返回true,则操作将被短路,因此,如果第一个命令失败,则仅执行第二个命令。
grep -q '^option.*' file.txt || echo 'option newparam' >> file.txt
-q
选项会抑制grep的输出,||
运算符只会在echo
命令失败时执行grep
命令,即$?
}不是0
。一个简单的例子:
$ cat file.txt
line 1
line 2
line 3
$ grep -q 'line 4' file.txt || echo 'line not in file'
line not in file
特殊变量$?
包含上一个命令的退出值。
$ grep -q 'line 4' file.txt
$ echo $?
1
$ grep -q 'line 3' file.txt
$ echo $?
0
答案 2 :(得分:1)
你可以在GNU sed中这样做,保留选项顺序:
/^otheroption.*/ {
s//otheroption newparam/ # Insert newparam
h # and remember it in HS
}
$ {
x # Check if option
/^otheroption/! { # was replaced,
x # if not append it
s/$/\notheroption newparam/ # to the last line
}
}
全部在一条线上:
sed '/^option.*/ { s//option newparam/; h; }; $ { x; /^option/! { x; s/$/\noption newparam/; }; }' somefile.conf