쉘의 두 레이블 사이에 있는 주석 행

쉘의 두 레이블 사이에 있는 주석 행

인스턴스의 두 구성 섹션 태그 사이에 캐싱을 비활성화/활성화하기 위해 OR를 httpd사용하여 주석 처리/주석 해제를 수행하고 싶습니다 .sedawk

Cache/ 키워드 로 시작하는 줄에 주석을 달거나 주석 처리를 해제할 수 있지만 Expires여전히 모듈 태그에 주석이 달린 채로 남아 있습니다. 시작 태그와 끝 태그 사이의 모든 줄에 단일 명령으로 주석 처리/주석 해제를 수행하는 방식으로 주석 처리/주석 해제를 수행하려면 어떻게 해야 합니까?

이는 샘플 캐시 구성입니다.

#<IfModule mod_cache.c>
#
#<IfModule mod_disk_cache.c>
# CacheRoot "/var/cache/mod_proxy"
# CacheEnable disk 
# CacheEnable disk 
# CacheEnable disk 
# CacheIgnoreCacheControl On
# CacheDirLevels 1
#</IfModule>
#
#</IfModule>

#<IfModule mod_expires.c>
#        Header set Cache-Control "max-age=604800, public"
#        ExpiresActive On
#        ExpiresDefault "access plus 1 week"
#        ExpiresByType text/cache-manifest "access plus 0 seconds"
#        ExpiresByType text/html "access plus 1 year"
#        ExpiresByType text/xml "access plus 0 seconds"
#        ExpiresByType application/xml "access plus 0 seconds"
#        ExpiresByType application/json "access plus 0 seconds"
#        ExpiresByType application/rss+xml "access plus 1 hour"
#        ExpiresByType application/atom+xml "access plus 1 hour"
#        ExpiresByType image/x-icon "access plus 1 week"
#        ExpiresByType image/gif "access plus 1 month"
#        ExpiresByType image/png "access plus 1 month"
#        ExpiresByType image/jpg "access plus 1 month"
#        ExpiresByType image/jpeg "access plus 1 month"
#        ExpiresByType video/ogg "access plus 1 month"
#        ExpiresByType audio/ogg "access plus 1 month"
#        ExpiresByType video/mp4 "access plus 1 month"
#        ExpiresByType video/webm "access plus 1 month"
#        ExpiresByType application/x-font-ttf "access plus 1 month"
#        ExpiresByType font/opentype "access plus 1 month"
#        ExpiresByType application/x-font-woff "access plus 1 month"
#        ExpiresByType image/svg+xml "access plus 1 month"
#        ExpiresByType application/vnd.ms-fontobject "access plus 1 month"
#        ExpiresByType text/css "access plus 1 year"
#        ExpiresByType application/javascript "access plus 1 year"
#</IfModule>

<IfModule mod_cache.c>그래서 나는 태그가 닫힐 때까지 태그 시작 사이의 모든 줄을 주석 처리할 수 있는 명령을 원합니다 <IfModule mod_expires.c>.

답변1

이 시도,

모듈에 주석을 달거나 주석 처리를 해제하려면 스크립트에 다음을 추가하세요.

 if [ "$2" == uncomment ]; then
    sed -i "/<IfModule $1>/,/<\/IfModule>/ s/^#//" apache.conf
 elif [ "$2" == comment ]; then
    sed -i "/<IfModule $1>/,/<\/IfModule>/ s/^\(<\| \)/#\1/" apache.conf
 fi

스크립트 실행을 위한 구문:

sh script.sh <moduleName> <comment/uncomment>

예:

sh script.sh mod_disk_cache.c uncomment

답변2

NET의 간단한 상태 머신을 사용하여 이 작업을 수행할 수 있습니다 awk. 단순화를 위해 다음과 같이 가정해 보겠습니다 mod.xml.

#stuff
#
#<IfModule mod_disk_cache.c>
# CacheRoot "/var/cache/mod_proxy"
# CacheEnable disk
# CacheEnable disk
# CacheEnable disk
# CacheIgnoreCacheControl On
# CacheDirLevels 1
#</IfModule>
#
#other stuff

그 다음에,

$ cat mod.xml | awk -F'#' 'BEGIN { state = 0; } { if (/mod_disk_cache/) state = !state; if (state) print $2; else print $0; if (/\/IfModule/) state = !state; }' > umod.xml
$ cat umod.xml
#stuff
#
<IfModule mod_disk_cache.c>
 CacheRoot "/var/cache/mod_proxy"
 CacheEnable disk
 CacheEnable disk
 CacheEnable disk
 CacheIgnoreCacheControl On
 CacheDirLevels 1
</IfModule>
#
#other stuff

이 변수는 state주석/주석 해제하려는 블록 내부( state == 0) 또는 외부( )에 있을 때를 기록합니다.state != 0

노트:여기서 중요한 점 중 하나는 위의 블록에 a로 끝나는 하위 블록이 포함되어 있지 않다는 것입니다 </IfModule>. 이렇게 하면 상태가 조기에 재설정될 수 있기 때문입니다. 이를 지원해야 한다면 국가는 더 많은 것을 확보해야 합니다. 예를 들어, -1대상 블록 외부에 있을 때 상태를 정수로 설정하고 , 0대상 블록에 들어갈 때 상태를 정수로 설정하고, 하위 블록에 들어갈 때 더 높은 값으로 증가시키는 것을 고려해 보세요.

mod_cache.c이 명령은 블록에 하위 블록이 중첩되어 있는 원래 입력을 처리합니다 .

$ cat mod.xml | awk -F# 'BEGIN { state = -1; } { if (/<IfModule mod_cache\.c>/) state = 0; else if (/<IfModule .*>/) state++; if (state >= 0) print $2; else print $0; if (/<\/IfModule/) state--;}'

간단한 예로 돌아가서 다시 주석을 달려면 비슷한 작업을 수행할 수 있습니다. 출력 필드 구분 기호(OFS)를 설정하고 true로 평가 #되면 각 줄 앞에 a 를 인쇄하면 됩니다 .state

$ cat umod.xml | awk -F'#' 'BEGIN { OFS=""; state = 0; } { if (/mod_disk_cache/) state = !state; if (state) print "#", $0; else print $0; if (/\/IfModule/) state = !state; }'
#stuff
#
#<IfModule mod_disk_cache.c>
# CacheRoot "/var/cache/mod_proxy"
# CacheEnable disk
# CacheEnable disk
# CacheEnable disk
# CacheIgnoreCacheControl On
# CacheDirLevels 1
#</IfModule>
#
#other stuff

답변3

주석을 제거하려면 다음 명령을 사용할 수 있습니다.

awk '/#.*IfModule mod_cache.c/,/#.*IfModule mod_expires.c/{gsub("#","",$0)}1'  filename

논평

awk '/^<IfModule mod_cache.c/,/^<IfModule mod_expires.c/{$0="#"$0}1'  filename

관련 정보