7줄을 grep하고 일치 후 텍스트를 바꾸려면 어떻게 해야 합니까?

7줄을 grep하고 일치 후 텍스트를 바꾸려면 어떻게 해야 합니까?

일치 후 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
  1. 예약된 공간에 범위를 저장합니다.
  2. 범위의 끝이 감지되면 보유 영역에서 범위를 검색하고
  3. 필요한 대체를 수행합니다.
  4. 이 범위 내에 없는 행은 유지되어 표준 출력으로 전달됩니다.

관련 정보