替换匹配字符串后的字符串 6 行

替换匹配字符串后的字符串 6 行

我只想将 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

相关内容