sed:在crontab中切换注释

时间:2013-11-28 12:03:15

标签: unix sed awk crontab

我的目标是创建一个脚本,对crontab进行以下更改。任何未注释的cron条目都会被注释,而任何注释的条目都会被注释掉。我的crontab注释中没有数字,所以我相信我提出的逻辑是合理的:

1)备份crontab 2)更改crontab

  • 如果该行以任何数字开头,请注释该行
  • 如果该行以注释后跟数字开头,则取消注释该行 3)重新加载crontab。

我特别需要第2步的帮助。我用它来评论所有行,但我发现很难再进一步:

sed -i 's/^\([^#]\)/#\1/g' Crontab.txt

有人会对上述目标有任何建议吗?我很感激任何帮助。

2 个答案:

答案 0 :(得分:3)

您可以使用sed轻松切换评论。

sed -i '# If line is a comment, uncomment
    # (replace \s with [    ] if your sed does not support \s for whitespace)
    s/^\s*#//
    # If the previous action did something, skip the rest
    t
    # If we are still here, comment out this entry
    s/^/#/' Crontab.txt

如果您的sed方言不理解\s,您可以使用评论中的替代[...]表达式。 (这是括号内的空格和制表符。您可以在许多shell中输入带有 ctrl-V选项卡的文字选项卡。)

要仅切换第一个非注释字符为数字的位置,请稍微调整正则表达式。

sed -i 's/#\([0-9]\)/\1/;t;s/^\([0-9]\)/#\1/' Crontab.txt

同样,存在一些方言变异;并非所有sed实现都需要在分组括号之前使用反斜杠,而不是所有sed实现都像分号一样作为语句分隔符。这里的主要优点是使用反向引用来捕获数字并在替换中引用它。

(星号也是crontab条目第一个字段中的允许字符;如果要包含它,只需在0-9之后添加该字符即可。)

答案 1 :(得分:0)

我建议分三步完成:

  1. 使用某些特殊文字
  2. 替换注释行中的前导#
  3. 为所有没有#
  4. 特殊文字的行添加前缀
  5. 删除特殊文字