Sedは、特定の正規表現とのマッチングや特定の方法でのテキスト操作には適していますが、これは私のものではないようです。この作業にsedを使用することはできますが、その結果はおそらく過度に複雑で壊れやすいでしょう。
あなたの最初の試みでした:
sed "s#\# 5 * * * 3 bash test.sh#5 * * * 3 bash test.sh#"
*
文字は正規表現の中の特殊文字であり、この場合は(、A「前のアトムの0以上」と訳されているので、これが失敗しましたスペース)。厳密に言えば、正規表現のアスタリスクをエスケープすることで、このsedスクリプトを動作させることができます(置換パターンでは不要です)。
しかし、これはこの特定のパターンに役立ちます。あなたの同僚の1人が、別のスクリプトとの競合を避けるために、5時でなく6時にこのスクリプトを実行することにしたらどうなりますか?または、コメント文字の後ろにスペースがありますか?突然あなたのsed置換が失敗します。
は問題のスクリプトのすべてのコメントの発生をコメントを解除するには、あなたが使用する可能性があります:
crontab -l | sed '/# *\([^ ][^ ]* *\)\{5\}[^ ]*test\.sh/s/^# *//' | crontab -
あなたがmore modern sedを使用している場合は、わずかに短いEREと、このBREを置き換えることができます:
を
crontab -l | sed -E '/# *([^ ]+ *){5}[^ ]*test\.sh/s/^# *//' | crontab -
出力はcrontab -l
です。これは明らかに完全なcrontabであり、sedで操作した後、出力に基づいて新しいcrontabをで書き込みます。sedスクリプトは、有効なcrontabのようなものに一致する行を検索します(実際のコメントには単にスクリプトを記述するのを避けるため)。そして、最初にコメント文字のみを削除する単純な置換を行います。スペース
[^ ]*
続く5非空白文字列、 - - 非任意の数 - ゼロ以上のスペース
([^ ]+ +){5}
続いコメント文字にマッチします
# *
:マッチしたパターンは次のように勃発します空白文字は、最大:
test\.sh
- あなたのスクリプトにつながります。
注意は、しかし、これはに@reboot
、@weekly
、@midnight
、などのようなタグを含む可能性のあるすべての有効なcrontabの時間を、一致していないことを詳細man 5 crontab
をチェックしてください。
awk
のような非SEDの代替は順序であるかもしれません。次のawkソリューションは私に多くの意味があります:
crontab -l | awk -v script="test.sh" '
{ field=6 }
/^#/{ field++ }
index($field,script) { sub(/^#/,"") }
1' \
| crontab -
それはほんの少し長いですが、私はそれが簡単に読んで理解することを見つけます。
代用区切り記号として '# 'を使用している特別な理由はありますか?不要な合併症のようだ。 – ghoti