0

我尝试使用“sed”完成的是在模式匹配时删除一行。如果模式不匹配,则添加一行。

但我怎么能做到这一点?提前致谢

示例:我希望它在 Crontab 中使用这一行:

*/1 * * * * script 1 test

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

4

4 回答 4

0
awk -v tgt='*/1 * * * * script 1 test' 'index($0,tgt){found=1;next} {print} END{if (!found) print tgt}' file
于 2013-01-28T20:43:47.680 回答
0

这可能对您有用(GNU sed):

sed 'x;/./{x;b};x;/pattern/{h;d};$a\append new line' file
于 2013-01-28T20:50:12.173 回答
0

仅在使用 grep -qF 'line' file && echo 'line' >> file 在文件中找不到时才追加行:

grep -qF '*/1 * * * * script 1 test' file || echo '*/1 * * * * script 1 test' >> file
于 2013-01-28T21:18:25.810 回答
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 时出现重复,例如使用制表符而不是空格,并且可以防止删除用户为自己添加的类似作业。

于 2013-01-28T20:51:10.987 回答