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:您能提供一些不起作用的示例输入吗?然后把它贴到问题上。我相信代码是好的,我只需要花多一点时间。