sed はファイルリストの部分文字列を置き換えます。

sed はファイルリストの部分文字列を置き換えます。

暗号化を更新できるcronファイルのリストがたくさんあります。各ファイルにはcronスケジュールがあり、時間と分を真夜中以降の時間に置き換えようとします。これを行うには、bashスクリプトを使用し、sedを使用して時間と分を更新しようとしています。私の人生では、私は台無しにされたsed代替品を見つけることができません。多くのフォーラムを検索してみましたが、設定を正しく設定できませんでした。これが私が得るものです:

for FILE in $(find ./renew -type f -name "letsen*") 
do
        # This will be the new min / hour
        TIMESET="$(($RANDOM % 59 + 0)) $(($RANDOM % 10 + 2))";
        sed -e 's/[0-9]+\W[0-9]+})/$TIMESET/' $FILE;
done

以下は LetsEncrypt ファイルの例です。

33 19 * * 5 root /bin/bash /home/forge/.letsencrypt-renew/711959 > /home/forge/.letsencrypt-renew/711959.out$

私は何を見逃していますか?どんな助けをありがとう!

修正する

Edgar Magalonに感謝します。これが私に役立つ解決策です。

for FILE in ./renew/letsen*
  do
        [[ -f $FILE && ! -L $FILE ]] && {
          TIMESET="$(($RANDOM % 59 + 0)) $(($RANDOM % 10 + 2))";
          
          # I think it's best to do a backup like what was suggested.
          sed -i'.bak' -Ee "s/[0-9]+[0-9]+/$TIMESET/" "$FILE";
        }
done

echo "Done! Have a great day~!";

答え1

繰り返しファイルのリストを使用しないでくださいfind。バラより検索結果を繰り返すのはなぜ悪い習慣ですか?

単純なforループを使用して、名前でファイルのリストを繰り返すことができますletsen*-type fを使ってコピーできます[[ -f $FILE ]]

コマンドについてはsed一重引用符を使用しているように見えますが'、時と分をthenに置き換えるには$TIMESET二重引用符を使用する必要があります"。また、これを参照してください:Bashの一重引用符と二重引用符の違い。使用するには-Eオプションを使用する必要があります。sed拡張正規表現

})なぜここにいるのかわかりません/[0-9]+\W[0-9]+})/。そうする必要はないと思います。私が正しく覚えているなら、この値を33 19に保存された値に置き換えたいからです$TIMESET
前述のように、この値を変更しようとすると、コードは次のようになります。

for FILE in ./renew/letsen*
do
        [[ -f $FILE ]] && {
        # This will be the new min / hour
        TIMESET="$(($RANDOM % 59 + 0)) $(($RANDOM % 10 + 2))";
        sed -Ee "s/[0-9]+\W[0-9]+/$TIMESET/" "$FILE"
        
        #Or I guess you can remove '\W' and use a single space.
        #I'm not sure if cron files have always a space between those numbers.
        #If so, then you could use this:
        sed -Ee "s/[0-9]+ [0-9]+/$TIMESET/" "$FILE"
      
        }
done

各ファイルを編集したい場合所定の位置に-iコマンドにオプションを追加する必要がありますsed

#If you want to backup every file:
sed -i'.bak' -Ee "s/[0-9]+\W[0-9]+/$TIMESET/" "$FILE"
#Without  backup
sed -i -Ee "s/[0-9]+\W[0-9]+/$TIMESET/" "$FILE"

関連情報