인스턴스의 두 구성 섹션 태그 사이에 캐싱을 비활성화/활성화하기 위해 OR를 httpd
사용하여 주석 처리/주석 해제를 수행하고 싶습니다 .sed
awk
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