MYAPP 문자열과 일치하여 cron의 주석 처리를 해제할 수 없습니다.

MYAPP 문자열과 일치하여 cron의 주석 처리를 해제할 수 없습니다.

다음은 활성화하려는 기존 크론입니다.

crontab -l

####Cron to auto restart MYAPP
###*/15 * * * * ansible-playbook  /web/playbooks/detectMYAPP/va_action.yml | tee -a /web/playbooks/detectMYAPP/cron.out

애플리케이션 이름을 일치시켜 cron을 활성화하고 싶습니다.MYAPP

sed동일한 목적을 달성하기 위해 다음 명령을 사용합니다 .

crontab -l> /web/playbooks/cronenabledisable/wladmin.cron
sed -i '/^#.*MYAPP/Is/^[#]*//' /web/playbooks/cronenabledisable/wladmin.cron
crontab /web/playbooks/cronenabledisable/wladmin.cron

####Cron to auto restart MYAPP불행하게도 cron을 설치할 수 없다는 주석이 달린 섹션의 주석을 제거했습니다 .

문제가 있는 전류 출력:

Cron to auto restart MYAPP
*/15 * * * * ansible-playbook  /web/playbooks/detectMYAPP/va_action.yml | tee -a /web/playbooks/detectMYAPP/cron.out

예상 출력:

####Cron to auto restart MYAPP
*/15 * * * * ansible-playbook  /web/playbooks/detectMYAPP/va_action.yml | tee -a /web/playbooks/detectMYAPP/cron.out

MYAPP참고: 댓글 섹션에 보관하고 싶습니다 . ####Cron to auto restart MYAPP즉, 명명 규칙 때문에 간단히 제거할 수는 없습니다.

답변1

사용sed

$ sed -Ei.bak '/#+(\*.*myapp)/Is//\1/' input_file
####Cron to auto restart MYAPP
*/15 * * * * ansible-playbook  /web/playbooks/detectMYAPP/va_action.yml | tee -a /web/playbooks/detectMYAPP/cron.out

-i.bak롤백해야 할 경우를 대비해 백업 파일이 생성됩니다.

답변2

우선, GNU-sed의 "-i" 옵션을 사용하지 않는 것이 좋습니다! 위험한. 파일의 "인라인 편집"을 수행한다고 주장하지만 실제로는 자동으로 임시 파일을 편집하고 원본 파일을 대체합니다. 즉, 소유자나 그룹이 변경될 수 있고, inode 번호와 기타 메타 정보가 확실히 변경되며, 표준 방법과 달리 사용하는 임시 파일을 제어할 수 없습니다. 이는 시스템이 적절한(잘못된) 순간에 충돌할 때 문제가 될 수 있습니다. 이것은 귀하의 문제가 아닐 수도 있지만 POSIX도 이를 지원하지 않으므로 이식성이 없습니다.

sed대신 처음부터(1970년 1월 1일 자정, 하하) 표준대로 하세요.

if sed '.....' /your/file > /path/to/tmpfile ; then
     mv /your/file /your/file.bak    # optional, create backup
     mv /path/to/tmpfile /your/file
     chown .....        # optionally adjust rights/ownership
     chmod .....
fi

이제 문제를 해결하려면 다음과 같이 잘못된 정규식을 사용하세요.

/^#.*MYAPP/

여기 당신이 찾고 있습니다줄의 시작, "#", 임의 개수의 문자, 마지막으로 "MYAPP". sed는 항상 "최장 일치"("탐욕"이라고도 함)를 사용합니다. 즉, octothorpe로 시작하고 어디에서나 "MYAPP" 문자열이 있는 줄이 있으면 일치가 됩니다. 이 줄도 마찬가지입니다.

###*/15 * * * * ansible-playbook  /web/playbooks/detectMYAPP/va_action.yml | tee -a /web/playbooks/detectMYAPP/cron.out

하지만 이런 것도 있습니다:

####Cron to auto restart MYAPP

예제 crontab이 중요한 경우 주석 처리된 코드 줄 앞에는 3개의 옥토소프만 있지만 주석에는 4개가 있으므로 해결책은 다음과 같습니다(관련 sed 코드만).

/^###[^#].*MYAPP/ s/^###//

이것은 처음에 정확히 3개의 옥토소프가 있는 줄에서만 작동합니다(3개의 옥토소프 뒤에 비옥토소프가 옵니다. "[^#]"는 "#"을 제외한 모든 것과 일치합니다). 그 뒤에는 줄의 아무 곳에나 "MYAPP"이 옵니다. 이 줄에서 처음 3개의 옥토소프는 어떤 것으로도 대체되지 않습니다(예: 삭제됨).

관련 정보