我尝试使用“sed”完成的是在模式匹配时删除一行。如果模式不匹配,则添加一行。
但我怎么能做到这一点?提前致谢
示例:我希望它在 Crontab 中使用这一行:
*/1 * * * * script 1 test
使用其他脚本,如果此模式存在,我想删除此行,否则,如果模式不匹配,则添加此行。
awk -v tgt='*/1 * * * * script 1 test' 'index($0,tgt){found=1;next} {print} END{if (!found) print tgt}' file
这可能对您有用(GNU sed):
sed 'x;/./{x;b};x;/pattern/{h;d};$a\append new line' file
仅在使用 grep -qF 'line' file && echo 'line' >> file 在文件中找不到时才追加行:
grep -qF '*/1 * * * * script 1 test' file || echo '*/1 * * * * script 1 test' >> file
一个好的做法是用注释标记您自动添加的 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 时出现重复,例如使用制表符而不是空格,并且可以防止删除用户为自己添加的类似作业。