以下是我希望启用的现有 cron
crontab -l
####Cron to auto restart MYAPP
###*/15 * * * * ansible-playbook /web/playbooks/detectMYAPP/va_action.yml | tee -a /web/playbooks/detectMYAPP/cron.out
我希望通过匹配应用程序名称来启用 cronMYAPP
我使用以下sed
命令进行相同的操作:
crontab -l> /web/playbooks/cronenabledisable/wladmin.cron
sed -i '/^#.*MYAPP/Is/^[#]*//' /web/playbooks/cronenabledisable/wladmin.cron
crontab /web/playbooks/cronenabledisable/wladmin.cron
不幸的是,它取消了注释部分的注释,即####Cron to auto restart MYAPP
无法安装 cron。
有问题的电流输出:
Cron to auto restart MYAPP
*/15 * * * * ansible-playbook /web/playbooks/detectMYAPP/va_action.yml | tee -a /web/playbooks/detectMYAPP/cron.out
预期输出:
####Cron to auto restart MYAPP
*/15 * * * * ansible-playbook /web/playbooks/detectMYAPP/va_action.yml | tee -a /web/playbooks/detectMYAPP/cron.out
注意:我希望保留MYAPP
在评论部分 ie####Cron to auto restart MYAPP
并且我不能为了命名约定而简单地删除它
使用
sed
-i.bak
将创建一个备份文件以防您需要回滚首先,一个建议:不要使用 GNU-sed 的“-i”选项!有危险。它声称对文件进行“内联编辑”,但实际上它只是自动编辑临时文件并替换原始文件。这意味着,它可能会更改所有者或组,它肯定会更改 inode 编号和其他元信息,并且 - 与使用标准方法不同 - 您无法控制它使用的临时文件。当系统在正确(错误)的时刻崩溃时,这可能会出现问题。这可能不是您的问题,但 POSIX 也不支持它,因此不可移植。
取而代之的是,像从一开始就遵循任何标准那样做
sed
(1970 年 1 月 1 日午夜,LOL):现在解决您的问题:这是一个错误的正则表达式:
在这里,您查找行首,后跟“#”,后跟任意数量的任意字符,再后跟“MYAPP”。sed 将始终使用“最长匹配”(也称为“贪婪”),这意味着:如果它看到任何以 octothorpe 和字符串“MYAPP”开头的任何行,它将是一个匹配项。这行是这样的:
还有这个:
如果您的示例 crontab 很重要,您的注释代码行前面只有 3 个 octothorpes,但注释有 4 个,因此解决方案可能是(只有相关的 sed 代码):
这仅适用于一行开头恰好有 3 个 octothorpes 的行(3 个 octothorpes 后跟一个非 octothorpe,“[^#]”匹配除“#”之外的任何内容,然后是行中任意位置的“MYAPP”。在这样的线路上,前 3 个 octothorpes 被替换为空(即:删除)。