我只想将 File_Check 块的 notification_interval 从 15 更改为 2。
我尝试在将 File_Check 行与以下内容匹配后更改第 6 行:
sed -e '6 /File_Check/ s/15/2/g' file.txt
但它不起作用。
这是文件.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”之前时,将用“2”替换“15”。
答案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
。