如何使用sed在模式匹配上删除/添加行

时间:2013-01-28 20:15:02

标签: linux bash sed

我尝试用'sed'是模式匹配时删除一行。 如果模式不匹配,则添加一行。

但我怎么能这样做呢? 提前致谢

实施例: 我想在Crontab中使用这一行:

*/1 * * * * script 1 test

使用其他脚本我想删除此行,如果此模式存在,否则,如果模式不匹配,则添加此行。

4 个答案:

答案 0 :(得分:0)

awk -v tgt='*/1 * * * * script 1 test' 'index($0,tgt){found=1;next} {print} END{if (!found) print tgt}' file

答案 1 :(得分:0)

这可能适合你(GNU sed):

sed 'x;/./{x;b};x;/pattern/{h;d};$a\append new line' file

答案 2 :(得分:0)

一个好的做法是使用注释标记自动添加的crontab条目:

* * * * * script 1 test #projectfoo-testjob

这使您可以轻松删除作业:

sed -i.bak '/projectfoo-testjob/d' file

或添加它:

grep -q "projectfoo-testjob" file || \
  echo '*/1 * * * * script 1 test #projectfoo-testjob' >> file

通过像这样标记作业,可以在用户重新格式化其crontab时防止重复,例如使用制表符而不是空格,可以防止删除用户为自己添加的类似作业。

答案 3 :(得分:0)

如果在文件中找不到使用grep -qF'line'文件&& echo'line'>>文件:

grep -qF '*/1 * * * * script 1 test' file || echo '*/1 * * * * script 1 test' >> file