无法通过匹配字符串 MYAPP 来取消注释 cron

无法通过匹配字符串 MYAPP 来取消注释 cron

以下是我希望启用的现有 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在评论部分,####Cron to auto restart MYAPP即为了命名约定我不能简单地将其删除

答案1

使用sed

$ sed -Ei.bak '/#+(\*.*myapp)/Is//\1/' input_file
####Cron to auto restart MYAPP
*/15 * * * * ansible-playbook  /web/playbooks/detectMYAPP/va_action.yml | tee -a /web/playbooks/detectMYAPP/cron.out

-i.bak将创建一个备份文件,以防您需要回滚

答案2

首先,建议:不要使用 GNU-sed 的“-i”选项!有危险。它声称对文件进行“内联编辑”,但实际上它只是自动编辑临时文件并替换原始文件。这意味着,它可能会更改所有者或组,它肯定会更改索引节点号和其他元信息,并且与使用标准方法不同,您无法控制它使用的临时文件。当系统在正确(错误)的时刻崩溃时,这可能会出现问题。这可能不是你的问题,但 POSIX 也不支持它,因此不可移植。

sed相反,就像从一开始就遵守任何标准一样去做(午夜,1970 年 1 月 1 日,哈哈):

if sed '.....' /your/file > /path/to/tmpfile ; then
     mv /your/file /your/file.bak    # optional, create backup
     mv /path/to/tmpfile /your/file
     chown .....        # optionally adjust rights/ownership
     chmod .....
fi

现在解决你的问题:这是一个错误的正则表达式:

/^#.*MYAPP/

在这里你寻找行首,后跟“#”,后跟任意数量的任意字符,最后跟“MYAPP”。 sed 将始终使用“最长匹配”(也称为“贪婪”),这意味着:如果它看到任何以 octothorpe 开头且任何地方都有字符串“MYAPP”的行,它将是一个匹配。对于这一行来说也是如此:

###*/15 * * * * ansible-playbook  /web/playbooks/detectMYAPP/va_action.yml | tee -a /web/playbooks/detectMYAPP/cron.out

但还有这个:

####Cron to auto restart MYAPP

如果您的示例 crontab 很重要,您的注释代码行前面只有 3 个 octothorpes,但注释有 4 个,因此解决方案可能是(仅相关 sed 代码):

/^###[^#].*MYAPP/ s/^###//

这仅适用于行首恰好有 3 个 octothorpe 的行(3 个 octothorpe 后跟一个非 octothorpe,“[^#]”匹配除“#”以外的任何内容),后跟行中任何位置的“MYAPP”。在这些行中,前 3 个 octothorpes 不被任何内容替换(即:删除)。

相关内容