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
뒤에 공백이 오고 최소한 한 자리 이상)을 \1
2로 바꾸는 것입니다. 이제 우리의 경우 \1
정규식 괄호 안에 캡처된 모든 항목을 나타냅니다 .\(...\)
notification_interval\s*
notification_interval
따라서 본질적으로 이것은 숫자 집합이 뒤따르는 임의의 수의 공백을 찾고 해당 숫자 집합을 2
.