我怎样才能改进这个正则表达式附加?

How can I improve this regex append?

我有这个 perl 命令来追加一个新行并且可以工作,但是它可以改进吗?

perl -p -i -e 's/^*.*normal_check_interval*.*5*.*$/\tnormal_check_interval\t\t5\n\tcheck_period\t\t\tmy_time_period/' file.cfg

例如,我认为我可以使用类似的东西:

perl -p -i -e 's/^*.*normal_check_interval*.*5*.*$/\t\n\tcheck_period\t\t\tmy_time_period/' file.cfg

但我不确定语法

提前致谢


编辑: @Sobrique 建议

一次编辑多个nagios cfg文件。

示例:

之前:

service{

    ...
    normal_check_interval   5
    ...
}

之后:

service{

    ...
    normal_check_interval   5
    check_period            my_time_period
    ...
}

编辑 2:

基于@Borodin 的回答,我最终得到了这个:

perl -p -i -e 's/^(\s+normal_check_interval\s+5)/\n\tcheck_period\t\t\tmy_time_period/' file

对于初学者:*.* 并不像您认为的那样在正则表达式中执行。

但除此之外 - 我可能会略有不同:

perl -pe '/normal_check_interval/ && $_ .= "\ncheck_period\tmy_check_period\n"' yourfile

应该可以解决这个问题 - 当您匹配正则表达式时模式匹配将触发,并将您的行附加到当前行。

您的正则表达式模式有问题

^*.*normal_check_interval*.*5*.*$

^* 开头,它是 零个或多个字符串 的开头,将引发警告

^* matches null string many times in regex

normal_check_interval* 也有类似的问题,它将匹配 normal_check_intervanormal_check_intervalnormal_check_intervall 等。我怀疑这是否是您想要的。同样,5* 将匹配一个空字符串,555555 等,所以它几乎没用

假设您的意思是

^.*normal_check_interval.*5.*$

匹配某处包含 normal_check_interval 的行,以及后面某处包含数字 5 的行。这是令人担忧的非特定性,但我不会像这样

那样附加到 $_ 的值上而不是替换
perl -i -pe '$_ .= "\tcheck_period\t\t\tmy_time_period\n" if /^\s+normal_check_interval\s+5\b/' file.cfg