我有这个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
答案 0 :(得分:1)
您的正则表达式模式存在问题
^*.*normal_check_interval*.*5*.*$
以^*
开头,零或更多字符串开头并会引发警告
^ *在正则表达式中多次匹配空字符串
normal_check_interval*
存在类似的问题,该问题将与normal_check_interva
,normal_check_interval
,normal_check_intervall
等相匹配。我怀疑这是否是您想要的。同样地,5*
将匹配空字符串5
,55
,555
等等,因此它几乎无用
让我们假设你的意思
^.*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
应该这样做 - 匹配正则表达式时模式匹配会触发,并将你的行追加到当前行。