Bash 如果没有sed模式回波>&燃气轮机;新线

Bash 如果没有sed模式回波>&燃气轮机;新线,bash,sed,Bash,Sed,我正在使用sed替换conf中的行: sed-i.bak的/^option.*/option newparam/'somefile.conf 如果某个文件中不存在我的选项行,我如何告诉sed插入它或返回false 最后我得到了: sed-i.bak“s/^#$STR.\\\\^#$STR.\\\^$STR./$OPT/“$FILE&&grep-q”^$OPT“$FILE | | echo”$OPT”>$FILE如果该行没有使用双管操作符将其附加到文件的末尾,请首先使用grep检查该行是否存在。如

我正在使用
sed
替换conf中的行:

sed-i.bak的/^option.*/option newparam/'somefile.conf

如果某个文件中不存在我的选项行,我如何告诉
sed
插入它或返回false

最后我得到了:


sed-i.bak“s/^#$STR.\\\\^#$STR.\\\^$STR./$OPT/“$FILE&&grep-q”^$OPT“$FILE | | echo”$OPT”>$FILE
如果该行没有使用双管操作符将其附加到文件的末尾,请首先使用grep检查该行是否存在。如果第一个命令返回true,则操作将短路,因此,只有在第一个命令失败时,才会执行第二个命令

grep-q'^option.*'file.txt | | echo'option newparam'>>file.txt

-q
选项抑制grep的输出,
|
运算符仅在
grep
命令失败时(即
$?
不是
0
时)才会执行
echo
命令。一个简单的例子:

$ 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
删除以
option
开头的行,将(
a
option newparam
附加到文件的最后一行(
$

sed -i.bak '/^option/d; $ a\option newparam' somefile.conf

注意:由于您说过如果
选项不存在,您希望插入新行,因此我认为新行的位置无关紧要。

您可以在GNU sed中这样做,保留选项顺序:

/^otheroption.*/{
s//otheroption newparam/#插入newparam
h#并在HS中记住它
}
$ {
x#检查选项是否正确
/^otheroption/!{#被替换,
x#如果没有,则附加它
s/$/\n选项newparam/#到最后一行
}
}
全部在一条线上:

sed '/^option.*/ { s//option newparam/; h; }; $ { x; /^option/! { x; s/$/\noption newparam/; }; }' somefile.conf

告诉它无条件地删除该选项(如果找到),并在末尾添加替换项?这假设顺序无关紧要。这太好了,它应该与上面的sed命令配合使用。如果你能投票选出所有有用的答案并接受最有用的答案,那就太好了!:)或者可能不是,因为我希望保持文件的原始值不变(即可读)。尽管如此,知道这一点还是很好的。你现在有16个代表,这足以支持投票并接受,通过接受你也将获得声誉奖金,有关更多信息,请参阅常见问题解答。您可以将此方法与您自己的
sed-i.bak
一起使用来备份文件。这似乎是我想要的,但我无法执行代码,尽管我有GNU版本。@chrisimpants:您能提供一些不起作用的示例输入吗?然后把它贴到问题上。我相信代码是好的,我只需要花多一点时间。