I am trying to check if message after "5:16:51:209|INFO| " starts with "Marker"
在我看来,您要检查的是是否Marker
紧随其后 5:16:51:209|INFO|
,因此使用正则表达式字符是不正确的,^
因为它会检查字符串的开头是否出现在该位置(当然,它没有t)。所以删除这个^
字符,Perl 会检查是否Marker
紧跟在后面。
此外,您需要|
像这样转义字符:\|
以防止它被视为正则表达式中的替代命令。然后您可以在单个替换命令中进行测试和替换:
if ( $lines[$i] =~ s/(\d{2}:\d{2}:\d{2}:\d{3})(\|\w+\|Marker)/$1|ICD$2/ )
{
# Line contained "Marker" and "|ICD" inserted
}
例子:
$ echo '15:16:51:209|INFO|Marker blah' | perl -ple 's/(\d{2}:\d{2}:\d{2}:\d{3})(\|\w+\|Marker)/$1|ICD$2/'
输出是:
15:16:51:209|ICD|INFO|Marker blah
编辑:@Prix 在评论中指出,如果时间戳应该出现在字符串的开头,那么^
开始标记应该在正则表达式的开头,以防止字符串其他部分的意外匹配(和性能):
s/^(\d{2}:\d{2}:\d{2}:\d{3})(\|\w+\|Marker)/$1|ICD$2/
↑
Use ^ here to anchor the search to the beginning of the string.