【问题标题】:sed: toggle comments in crontabsed:在 crontab 中切换注释
【发布时间】:2013-11-28 20:25:38
【问题描述】:

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

1) 备份 crontab 2) 更改 crontab

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

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

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

有人对实现我的上述目标有什么建议吗?如有任何帮助,我将不胜感激。

【问题讨论】:

标签: unix sed awk crontab


【解决方案1】:

您可以使用sed 轻松切换cmets。

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 tab 输入文字制表符。)

要仅在第一个非注释字符是数字的情况下切换,请稍微调整正则表达式。

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

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

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

【讨论】:

    【解决方案2】:

    我建议分三步进行:

    1. 将注释行中的前导 # 替换为一些特殊文本
    2. 在所有没有特殊文本的行前面加上#
    3. 删除特殊文字

    【讨论】:

      猜你喜欢
      • 2015-07-23
      • 1970-01-01
      • 2012-08-13
      • 2012-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-16
      • 2021-09-26
      相关资源
      最近更新 更多