![sed는 파일 목록의 하위 문자열을 대체합니다.](https://linux55.com/image/213542/sed%EB%8A%94%20%ED%8C%8C%EC%9D%BC%20%EB%AA%A9%EB%A1%9D%EC%9D%98%20%ED%95%98%EC%9C%84%20%EB%AC%B8%EC%9E%90%EC%97%B4%EC%9D%84%20%EB%8C%80%EC%B2%B4%ED%95%A9%EB%8B%88%EB%8B%A4..png)
암호화를 갱신할 수 있는 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"