我怎样才能改进这个正则表达式附加?
How can I improve this regex 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\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)/\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*.*$
以 ^*
开头,它是 零个或多个字符串 的开头,将引发警告
^* matches null string many times in regex
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
我有这个 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\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)/\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*.*$
以 ^*
开头,它是 零个或多个字符串 的开头,将引发警告
^* matches null string many times in regex
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