일치하는 문자열 뒤에 문자열 6줄을 바꿉니다.

일치하는 문자열 뒤에 문자열 6줄을 바꿉니다.

File_Check 블록의notification_interval을 15에서 2로 변경하고 싶습니다.

File_Check 라인을 다음과 일치시킨 후 라인 6을 변경해 보았습니다.

sed -e '6 /File_Check/ s/15/2/g' file.txt 

하지만 작동하지 않습니다.

이것은 file.txt입니다.

define service {
    host_name                       local
    service_description             Memory
    check_command                   check_nrpe
    max_check_attempts              3
    check_interval                  5
    retry_interval                  1
    check_period                    24x7
    notification_interval           15
    contact_groups                  test
    notification_period             24x7
    notifications_enabled           0
    notification_options            w,c
    _xiwizard                       nrpe
    register                        1
    }

define service {
    host_name                       local
    service_description             File_Check
    check_command                   check_nrpe
    max_check_attempts              3
    check_interval                  5
    retry_interval                  1
    check_period                    24x7
    notification_interval           15
    contact_groups                  test
    notification_period             24x7
    notifications_enabled           0
    notification_options            w,c
    _xiwizard                       nrpe
    register                        1
    }

답변1

sed '/File_Check/,/contact_groups/ s/\(notification_interval\s*\)15/\12/g' file.txt

이는 "File_Check"와 일치하는 줄로 시작하여 "contact_groups"와 일치하는 줄로 끝나며, "notification_interval"이 줄의 "15" 앞에 오면 "15"를 "2"로 대체합니다.

답변2

사용하는 perl것은 또 다른 옵션입니다.

perl -p00 -e 'if (/File_Check/) {s/(notification_interval\s*)15/${1}2/}' file.txt

-00옵션은 Perl에게 "단락 모드", 즉 빈 줄로 구분된 텍스트 블록에서 입력을 읽도록 지시합니다. 이 s///작업은 포함된 단락에서만 작동합니다 File_Check.

답변3

대체 논리 sed:

sed -e '/File_Check/{
          :loop
          /notification_interval/!{
            N;
            b loop
          }; s/\(notification_interval\s*\)[0-9]\+/\12/
        }' your_file

설명하다

일치시키면서 File_Check일치하는 항목을 얻을 때까지 계속해서 새 줄을 읽고 이를 패턴 공간에 추가하십시오 notification_interval. 일치하면 필요한 정규식 대체를 수행하십시오. 여기서 내가 선택한 대체 방법은 notification_interval\s*[0-9]\+( notification_interval뒤에 공백이 오고 최소한 한 자리 이상)을 \12로 바꾸는 것입니다. 이제 우리의 경우 \1정규식 괄호 안에 캡처된 모든 항목을 나타냅니다 .\(...\)notification_interval\s*

notification_interval따라서 본질적으로 이것은 숫자 집합이 뒤따르는 임의의 수의 공백을 찾고 해당 숫자 집합을 2.

관련 정보