2016-03-08 56 views
1

我有这个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回答我finnaly得到这个:

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

请你可以添加一些样品输入/输出的价值?它会使有用的答案更容易。 (例如,答案可能不是像正则表达式那样替换) – Sobrique

+0

我们确实需要查看输入数据 – Borodin

+0

我的解决方案没有直接工作是否有原因?真的不需要使用替代。 – Borodin

回答

1

有你的正则表达式模式

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

问题与^*这是字符串的零个或多个启动开始,将提高预警

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

还有一个类似的问题normal_check_interval*,这将匹配normal_check_interva,normal_check_interval, normal_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 
+0

它取得了诀窍,谢谢! – downtheroad

0

对于初学者:*.*不会做你认为它在正则表达式中的作用。

但是,一边 - 我可能会做略有不同:

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

应该做的伎俩 - 当你匹配的正则表达式模式匹配会火,并且将你的行追加到当前行。

+0

你正在添加一个多余的换行符。你是不是指''\ tcheck时期......“'?我不太确定OP的模式中的'5'是不相关的! – Borodin