일치 후 7줄을 grep하고 이 7줄의 컨텍스트를 바꾸고 동일한 파일에 저장하려고 합니다.
예를 들어:
<IfModule prefork.c>
StartServers 8
MinSpareServers 5
MaxSpareServers 20
ServerLimit 256
MaxClients 256
MaxRequestsPerChild 4000
</IfModule>
MaxRequestsPerChild
대체된 값을 사용하고 싶습니다 5000
.
나는 이전에 시도했습니다:
grep "IfModule prefork.c" httpd.conf -A7 | /bin/sed -nE "/\bMaxRequestsPerChild\b/ s/[0-9]+/50/"
하지만 행운은 없습니다.
답변1
이것은 SED 솔루션입니다.
sed '/<IfModule prefork.c>/,/MaxRequestsPerChild/s/MaxRequestsPerChild.*/MaxRequestsPerChild 5000/' apacheconf
모듈 이름을 일치시킨 후 다음 "MaxRequestsPerChild" 줄을 5000 값으로 바꾸는 방식으로 작동합니다. 다른 모든 모듈에 대해서는 "MaxRequestsPerChild"를 무시합니다.
답변2
GNU sed 사용(구문/기능이 다른 버전에서 작동하는지 확실하지 않음)
일치하는 줄 이후 6줄 내에서 변경하려면 다음을 수행하세요.
sed -E '/IfModule prefork\.c/{N;N;N;N;N;N;s/(MaxRequestsPerChild +)[0-9]+/\15000/}'
여기서 N
개행 문자가 패턴 공간에 추가되고 다음 입력 라인이 패턴 공간에 추가됩니다.
항상 6번째 줄인 경우:
sed -E '/IfModule prefork\.c/{n;n;n;n;n;n;s/[0-9]+/5000/}'
그러면 n
패턴 공간이 다음 입력 줄로 대체됩니다.
또는 상대 주소 지정의 더 간단한 구문을 사용하십시오.
sed -E '/IfModule prefork\.c/,+6 s/(MaxRequestsPerChild +)[0-9]+/\15000/'
답변3
당신은 넣을 수 있습니다 sed range operator ,
줄 번호에 관심이 없다면 다음을 활용하세요.
sed -e '
/<IfModule prefork.c>/,\|</IfModule>|!b
H;\|</IfModule>|!d;g;s/.//;
s/\(\(\n\)MaxRequestsPerChild[[:blank:]]\{1,\}\)[1-9][0-9]*\n/\15000\2/
' config-file
- 예약된 공간에 범위를 저장합니다.
- 범위의 끝이 감지되면 보유 영역에서 범위를 검색하고
- 필요한 대체를 수행합니다.
- 이 범위 내에 없는 행은 유지되어 표준 출력으로 전달됩니다.