【问题标题】:How can I improve this regex append?如何改进这个正则表达式附加?
【发布时间】:2016-03-08 14:44:57
【问题描述】:

我有这个 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

【问题讨论】:

  • 请您添加一些示例输入/输出?它将使有用的答案更容易。 (例如,答案可能不是这样的正则表达式模式替换)
  • 我们确实需要查看输入数据
  • 我的解决方案不能直接工作是有原因的吗?真的没有必要使用替代品。
  • @Borodin 您的解决方案运行顺利 ;)

标签: regex perl append


【解决方案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

【讨论】:

    【解决方案2】:

    对于初学者:*.* 不会像您认为它在正则表达式中那样做。

    但除此之外 - 我可能会稍微不同:

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

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

    【讨论】:

    • 您添加了一个多余的换行符。你的意思是"\tcheck period..."?而且我不太确定 OP 模式中的 5 是否无关紧要!
    猜你喜欢
    • 1970-01-01
    • 2020-07-09
    • 2022-07-31
    • 1970-01-01
    • 1970-01-01
    • 2021-05-21
    • 2012-03-24
    • 1970-01-01
    • 2020-05-03
    相关资源
    最近更新 更多