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桁以上)を\1
2に置き換えることです。これで、\1
正規表現の括弧内にキャプチャされたすべての項目が表示されます。\(...\)
notification_interval\s*
notification_interval
したがって、本質的に、これは数字のセットが続く任意の数のスペースを探して、その数のセットを2
。