Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 如何改进这个正则表达式?_Regex_Perl_Append - Fatal编程技术网

Regex 如何改进这个正则表达式?

Regex 如何改进这个正则表达式?,regex,perl,append,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

我有这个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
但我不确定语法

提前谢谢


编辑: @索布里克建议

它用于同时编辑多个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

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

但除此之外,我可能会做一些不同的事情:

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

应该这样做-模式匹配将在匹配正则表达式时触发,并将您的行附加到当前行

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

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

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

normal\u check\u interval*
也有类似的问题,它将匹配
normal\u check\u interva
normal\u check\u interval
等。我怀疑这是否是您想要的。同样地,
5*
将匹配一个空字符串,
5
55
555
等。因此它几乎没有用处

让我们假设你的意思是

^.*normal_check_interval.*5.*$
它匹配包含
normal\u check\u interval
的行,以及后面某个地方的数字
5
。这是一个令人担忧的非特定值,但我不会像这样在
$的值后面添加替换

perl -i -pe '$_ .= "\tcheck_period\t\t\tmy_time_period\n" if /^\s+normal_check_interval\s+5\b/' file.cfg

请添加一些示例输入/输出?这将使有用的答案变得更容易。(例如,答案可能不是这样的正则表达式模式替换)我们真的需要查看输入数据我的解决方案不能直接工作有什么原因吗?真的没有必要使用替代品。@Borodin您的解决方案工作顺利;)你在添加多余的换行符。您的意思是“检查时段…”吗?我不太确定OP模式中的
5
是否无关!