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"

관련 정보