如何改进此正则表达式附加?

时间:2016-03-08 14:44:58

标签: regex perl 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$1\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)/$1\n\tcheck_period\t\t\tmy_time_period/' file

2 个答案:

答案 0 :(得分:1)

您的正则表达式模式存在问题

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

^*开头,零或更多字符串开头并会引发警告

  

^ *在正则表达式中多次匹配空字符串

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

答案 1 :(得分:0)

对于初学者:*.*没有做你认为在正则表达式中做的事情。

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

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

应该这样做 - 匹配正则表达式时模式匹配会触发,并将你的行追加到当前行。