一致する文字列の後に文字列の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後にスペースが来て少なくとも1桁以上)を\12に置き換えることです。これで、\1正規表現の括弧内にキャプチャされたすべての項目が表示されます。\(...\)notification_interval\s*

notification_intervalしたがって、本質的に、これは数字のセットが続く任意の数のスペースを探して、その数のセットを2

関連情報